Imported Upstream version 0.1.12
authorMatteo F. Vescovi <mfv@debian.org>
Fri, 13 Feb 2015 11:22:12 +0000 (12:22 +0100)
committerMatteo F. Vescovi <mfv@debian.org>
Fri, 13 Feb 2015 11:22:12 +0000 (12:22 +0100)
96 files changed:
AUTHORS
INSTALL
Makefile.am
Makefile.in
NEWS
README
aclocal.m4
babl/Makefile.am
babl/Makefile.in
babl/babl-conversion.c
babl/babl-cpuaccel.c
babl/babl-cpuaccel.h
babl/babl-extension.c
babl/babl-fish-path.c
babl/babl-fish-reference.c
babl/babl-fish-stats.c
babl/babl-format.c
babl/babl-ids.h
babl/babl-internal.h
babl/babl-introspect.c
babl/babl-list.h
babl/babl-memory.c
babl/babl-model.c
babl/babl-palette.c
babl/babl-ref-pixels.c [new file with mode: 0644]
babl/babl-ref-pixels.h [new file with mode: 0644]
babl/babl-ref-pixels.inc [new file with mode: 0644]
babl/babl-type.c
babl/babl-types.h
babl/babl-util.c
babl/babl-util.h
babl/babl-version.h
babl/babl.c
babl/babl.h
babl/base/Makefile.am
babl/base/Makefile.in
babl/base/babl-base.c
babl/base/babl-base.h
babl/base/model-gray.c
babl/base/model-rgb.c
babl/base/pow-24.c [new file with mode: 0644]
babl/base/pow-24.h [new file with mode: 0644]
babl/base/rgb-constants.h
babl/base/type-half.c [new file with mode: 0644]
babl/base/type-u15.c [new file with mode: 0644]
babl/base/util.h
config.h.in
config.sub
configure
configure.ac
depcomp
docs/Makefile.in
docs/graphics/Makefile.am
docs/graphics/Makefile.in
docs/index-static.html.in
extensions/CIE.c
extensions/HSL.c [new file with mode: 0644]
extensions/HSV.c [new file with mode: 0644]
extensions/Makefile.am
extensions/Makefile.in
extensions/cairo-tables.h [new file with mode: 0644]
extensions/cairo.c
extensions/float.c
extensions/gegl-fixups.c
extensions/gggl-lies.c
extensions/gggl.c
extensions/grey.c [new file with mode: 0644]
extensions/naive-CMYK.c
extensions/simple.c [new file with mode: 0644]
extensions/sse-fixups.c [deleted file]
extensions/sse2-float.c [new file with mode: 0644]
extensions/sse2-int16.c [new file with mode: 0644]
extensions/sse2-int8.c [new file with mode: 0644]
extensions/two-table-tables.h [new file with mode: 0644]
extensions/two-table.c [new file with mode: 0644]
extensions/ycbcr.c [new file with mode: 0644]
ltmain.sh
m4/introspection.m4 [deleted file]
m4/libtool.m4
tests/Makefile.am
tests/Makefile.in
tests/babl_fish_path_fitness.c
tests/cairo-RGB24.c [new file with mode: 0644]
tests/common.inc [new file with mode: 0644]
tests/extract.c
tests/float-to-8bit.c [new file with mode: 0644]
tests/floatclamp.c [new file with mode: 0644]
tests/grayscale_to_rgb.c
tests/hsl.c [new file with mode: 0644]
tests/hsva.c [new file with mode: 0644]
tests/n_components_cast.c [new file with mode: 0644]
tests/palette.c
tests/srgb_to_lab_u8.c
tools/Makefile.am [new file with mode: 0644]
tools/Makefile.in [new file with mode: 0644]
tools/babl-gen-test-pixels.c [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
index ec8d0319b0f6d817466357940164a706b67a6146..53f57749e127eefaa2028e08ea90f8884325a050 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
         <dd>Initial work to make babl threadsafe</dd>
   <dt>Rupert Weber <em>gimp at leguanease.org</em></dt>
         <dd>Documentation and other improvements</dd>
+  <dt>Jehan <em>jehan at girinstud.io</em></dt>
+        <dd>win32 portabilitiy</dd>
+  <dt>Sven Claussner</dt>
+        <dd>Update DOAP file</dd>
+  <dt>Alexander Larsson</dt>
+        <dd>Math optimizations</dd>
+  <dt>Nils Philippsen</dt>
+        <dd>code cleanups</dd>
+  <dt>Simon Budig</dt>
+  <dd>cleanups</dd>
 
+  <dt>Micheal Muré</dd>
+  <dd>portability fixes</dd>
+
+  <dt>Maxime Nicco</dt>
+    <dl>HSV color model extension</dl>
+  <dt>Teo Mazars</dt>
+        <dd>Color spaces/models in extensions</dd>
+  <dt>Daniel Sabo</dt>
+        <dd>Dead code elimination, general cleanups, </dd>
+  <dt>Michael Henning</dt>
+        <dd>Conversion fixes</dd>
+  <dt>Elle Stone</dt>
+        <dd>Verification and improvements to accuracy of color space
+        conversions.</dd>
 </dl>
diff --git a/INSTALL b/INSTALL
index 799229539732ec03c971eb2b255213bbb852c2cb..18e056791c5f5bb294c3c87198158b1191f9eacc 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -1,5 +1,5 @@
 
-babl 0.1.10
+babl 0.1.12
 
     Dynamic; any to any, pixel format conversion library.
 
@@ -12,10 +12,10 @@ From a released version the following is the expected method of
 installation (or a variation on this theme):
 
      ------------------------------------------------------------
-     foo$ wget ftp://ftp.gtk.org/pub/babl/0.1/babl-0.1.10.tar.bz2
-     foo$ tar jxf babl-0.1.10.tar.gz
-     foo$ cd babl-0.1.10
-     foo/babl-0.1.10$ ./configure && make && sudo make install
+     foo$ wget ftp://ftp.gtk.org/pub/babl/0.1/babl-0.1.12.tar.bz2
+     foo$ tar jxf babl-0.1.12.tar.gz
+     foo$ cd babl-0.1.12
+     foo/babl-0.1.12$ ./configure && make && sudo make install
      ------------------------------------------------------------
 
 
index 19df3268c425dc41321d238b2b2266de5b96ce15..e46014c13230cc363a8c2011b3015a11ed70253c 100644 (file)
@@ -1,11 +1,14 @@
 ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
-#DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
 
 SUBDIRS = \
        babl            \
        extensions      \
        tests           \
-       docs
+       tools
+
+if ENABLE_DOCS
+SUBDIRS+= docs
+endif
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = babl.pc
@@ -20,7 +23,6 @@ EXTRA_DIST = \
        NEWS                    \
        TODO                    \
        autogen.sh              \
-       m4/introspection.m4     \
        babl.pc.in
 
 DISTCLEANFILES = \
index ee7ae61c2a56ffad3b0b288d848be29f21981a4c..a14cbfc3384e6af24f6b87f81a5cf3f679a6257e 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 @SET_MAKE@
 
 VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -34,6 +51,8 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
+target_triplet = @target@
+@ENABLE_DOCS_TRUE@am__append_1 = docs
 subdir = .
 DIST_COMMON = README $(am__configure_deps) $(srcdir)/INSTALL.in \
        $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
@@ -42,11 +61,10 @@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/INSTALL.in \
        TODO config.guess config.sub depcomp install-sh ltmain.sh \
        missing
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/introspection.m4 \
-       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
-       $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
@@ -70,6 +88,11 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
        install-pdf-recursive install-ps-recursive install-recursive \
        installcheck-recursive installdirs-recursive pdf-recursive \
        ps-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -106,7 +129,7 @@ AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
        distdir dist dist-all distcheck
 ETAGS = etags
 CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
+DIST_SUBDIRS = babl extensions tests tools docs
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
@@ -193,14 +216,6 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
-INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
-INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
-INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
-INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
-INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
-INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
-INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -230,18 +245,15 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEP = @PATH_SEP@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
 RANLIB = @RANLIB@
 RSVG = @RSVG@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SHREXT = @SHREXT@
+SSE2_EXTRA_CFLAGS = @SSE2_EXTRA_CFLAGS@
 SSE_EXTRA_CFLAGS = @SSE_EXTRA_CFLAGS@
 STRIP = @STRIP@
-VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 W3M = @W3M@
 WEBSITE_HOST = @WEBSITE_HOST@
@@ -294,18 +306,16 @@ sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sysconfdir = @sysconfdir@
+target = @target@
 target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
-#DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
-SUBDIRS = \
-       babl            \
-       extensions      \
-       tests           \
-       docs
-
+SUBDIRS = babl extensions tests tools $(am__append_1)
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = babl.pc
 built_dist_files = README
@@ -317,7 +327,6 @@ EXTRA_DIST = \
        NEWS                    \
        TODO                    \
        autogen.sh              \
-       m4/introspection.m4     \
        babl.pc.in
 
 DISTCLEANFILES = \
@@ -392,8 +401,11 @@ distclean-libtool:
        -rm -f libtool config.lt
 install-pkgconfigDATA: $(pkgconfig_DATA)
        @$(NORMAL_INSTALL)
-       test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)"
        @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -578,13 +590,10 @@ distdir: $(DISTFILES)
        done
        @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
          if test "$$subdir" = .; then :; else \
-           test -d "$(distdir)/$$subdir" \
-           || $(MKDIR_P) "$(distdir)/$$subdir" \
-           || exit 1; \
-         fi; \
-       done
-       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
            dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
            $(am__relativize); \
            new_distdir=$$reldir; \
@@ -669,7 +678,7 @@ distcheck: dist
        *.zip*) \
          unzip $(distdir).zip ;;\
        esac
-       chmod -R a-w $(distdir); chmod a+w $(distdir)
+       chmod -R a-w $(distdir); chmod u+w $(distdir)
        mkdir $(distdir)/_build
        mkdir $(distdir)/_inst
        chmod a-w $(distdir)
diff --git a/NEWS b/NEWS
index a123cc3de49bfe36b27be7218e2223aa34eda272..d94336bb0427926af550d26065d6abfcd53895a8 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,7 +5,11 @@ the news section both in the README and the webpage.
 
                                                                           -->
 
-2012-03-30 babl-0.1.8                                               </dt><dd>
+2012-03-30 babl-0.1.12                                              </dt><dd>
+optimizations for floating point conversions, HSV and HSL color models,
+removal of dead code, fixed CIE Lab conversions.
+                                                                    </dd><dt>
+2012-03-30 babl-0.1.10                                              </dt><dd>
 LUT based speedups for gamma correction / uncorrection.
                                                                     </dd><dt>
 2012-03-30 babl-0.1.8                                               </dt><dd>
diff --git a/README b/README
index 1583b9518675a5e1bb15acccdb975838ab07eaef..99096bb7deb2ef02f8af2ce0311a69c3c7315904 100644 (file)
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-Babl-0.1.10
+Babl-0.1.12
 
 Contents
 
@@ -59,7 +59,10 @@ babl release. If there are significant improvements to babl when a GEGL
 release is done a babl release is most often put out just prior to the
 GEGL release.
 
-2012-03-30 babl-0.1.8
+2012-03-30 babl-0.1.12
+    optimizations for floating point conversions, HSV and HSL color
+    models, removal of dead code, fixed CIE Lab conversions.
+2012-03-30 babl-0.1.10
     LUT based speedups for gamma correction / uncorrection.
 2012-03-30 babl-0.1.8
     Added support for indexed/pallette based formats, constified API.
@@ -131,9 +134,9 @@ of pixels, with different pixel formats.
 
 int width = 123, height = 581, pixel_count = width * height;
 
-const Babl *srgb            = babl_format ("R'G'B' u8");
-const Babl *lab             = babl_format ("CIE Lab float");
-Babl       *rgb_to_lab_fish = babl_fish (srgb, lab);
+const Babl *srgb             = babl_format ("R'G'B' u8");
+const Babl *lab              = babl_format ("CIE Lab float");
+const Babl *srgb_to_lab_fish = babl_fish (srgb, lab);
 
 float         *lab_buffer;
 unsigned char *srgb_buffer;
@@ -145,7 +148,7 @@ lab_buffer  = malloc (pixel_count * 3 * sizeof (float));
 
 ...... load data into srgb_buffer .......
 
-babl_process (rgb_to_lab_fish, srgb_buffer, lab_buffer, pixel_count);
+babl_process (srgb_to_lab_fish, srgb_buffer, lab_buffer, pixel_count);
 
 ...... do operation in lab space ........
 
@@ -177,6 +180,20 @@ bits
 bytes
     8
 
+u15
+
+bits
+    16
+bytes
+    2
+
+half
+
+bits
+    16
+bytes
+    2
+
 float
 
 bits
@@ -391,6 +408,23 @@ components
     CIE H(ab)
     A
 
+HSVA
+
+components
+
+    hue
+    saturation
+    value
+    alpha
+
+HSV
+
+components
+
+    hue
+    saturation
+    value
+
 CMYK
 
 components
@@ -400,6 +434,48 @@ components
     yellow
     key
 
+CMY
+
+components
+
+    cyan
+    magenta
+    yellow
+
+Y'CbCr709
+
+components
+
+    Y'
+    Cb
+    Cr
+
+Y'CbCrA709
+
+components
+
+    Y'
+    Cb
+    Cr
+    alpha
+
+HSLA
+
+components
+
+    hue
+    saturation
+    lightness
+    alpha
+
+HSL
+
+components
+
+    hue
+    saturation
+    lightness
+
 Pixel formats
 RGBA double
 
@@ -527,6 +603,234 @@ components
     float  G
     float  B
 
+RGB half
+
+bytes/pixel
+    6
+model
+    RGB
+components
+
+    half  R
+    half  G
+    half  B
+
+RGBA half
+
+bytes/pixel
+    8
+model
+    RGBA
+components
+
+    half  R
+    half  G
+    half  B
+    half  A
+
+RaGaBaA half
+
+bytes/pixel
+    8
+model
+    RaGaBaA
+components
+
+    half  Ra
+    half  Ga
+    half  Ba
+    half  A
+
+R'G'B' half
+
+bytes/pixel
+    6
+model
+    R'G'B'
+components
+
+    half  R'
+    half  G'
+    half  B'
+
+R'G'B'A half
+
+bytes/pixel
+    8
+model
+    R'G'B'A
+components
+
+    half  R'
+    half  G'
+    half  B'
+    half  A
+
+R'aG'aB'aA half
+
+bytes/pixel
+    8
+model
+    R'aG'aB'aA
+components
+
+    half  R'a
+    half  G'a
+    half  B'a
+    half  A
+
+RGB u15
+
+bytes/pixel
+    6
+model
+    RGB
+components
+
+    u15  R
+    u15  G
+    u15  B
+
+RGBA u15
+
+bytes/pixel
+    8
+model
+    RGBA
+components
+
+    u15  R
+    u15  G
+    u15  B
+    u15  A
+
+RaGaBaA u15
+
+bytes/pixel
+    8
+model
+    RaGaBaA
+components
+
+    u15  Ra
+    u15  Ga
+    u15  Ba
+    u15  A
+
+R'G'B' u15
+
+bytes/pixel
+    6
+model
+    R'G'B'
+components
+
+    u15  R'
+    u15  G'
+    u15  B'
+
+R'G'B'A u15
+
+bytes/pixel
+    8
+model
+    R'G'B'A
+components
+
+    u15  R'
+    u15  G'
+    u15  B'
+    u15  A
+
+R'aG'aB'aA u15
+
+bytes/pixel
+    8
+model
+    R'aG'aB'aA
+components
+
+    u15 R'a
+    u15 G'a
+    u15 B'a
+    u15 A
+
+RGB u32
+
+bytes/pixel
+    12
+model
+    RGB
+components
+
+    u32  R
+    u32  G
+    u32  B
+
+RGBA u32
+
+bytes/pixel
+    16
+model
+    RGBA
+components
+
+    u32  R
+    u32  G
+    u32  B
+    u32  A
+
+RaGaBaA u32
+
+bytes/pixel
+    16
+model
+    RaGaBaA
+components
+
+    u32  Ra
+    u32  Ga
+    u32  Ba
+    u32  A
+
+R'G'B' u32
+
+bytes/pixel
+    12
+model
+    R'G'B'
+components
+
+    u32  R'
+    u32  G'
+    u32  B'
+
+R'G'B'A u32
+
+bytes/pixel
+    16
+model
+    R'G'B'A
+components
+
+    u32  R'
+    u32  G'
+    u32  B'
+    u32  A
+
+R'aG'aB'aA u32
+
+bytes/pixel
+    16
+model
+    R'aG'aB'aA
+components
+
+    u32 R'a
+    u32 G'a
+    u32 B'a
+    u32 A
+
 Y double
 
 bytes/pixel
@@ -591,6 +895,198 @@ components
     double  Y'a
     double  A
 
+YA half
+
+bytes/pixel
+    4
+model
+    YA
+components
+
+    half  Y
+    half  A
+
+YaA half
+
+bytes/pixel
+    4
+model
+    YaA
+components
+
+    half  Ya
+    half  A
+
+Y half
+
+bytes/pixel
+    2
+model
+    Y
+components
+
+    half  Y
+
+Y'A half
+
+bytes/pixel
+    4
+model
+    Y'A
+components
+
+    half  Y'
+    half  A
+
+Y'aA half
+
+bytes/pixel
+    4
+model
+    Y'aA
+components
+
+    half  Y'a
+    half  A
+
+Y' half
+
+bytes/pixel
+    2
+model
+    Y'
+components
+
+    half  Y'
+
+YA u15
+
+bytes/pixel
+    4
+model
+    YA
+components
+
+    u15  Y
+    u15  A
+
+YaA u15
+
+bytes/pixel
+    4
+model
+    YaA
+components
+
+    u15  Ya
+    u15  A
+
+Y u15
+
+bytes/pixel
+    2
+model
+    Y
+components
+
+    u15  Y
+
+Y'A u15
+
+bytes/pixel
+    4
+model
+    Y'A
+components
+
+    u15  Y'
+    u15  A
+
+Y'aA u15
+
+bytes/pixel
+    4
+model
+    Y'aA
+components
+
+    u15 Y'a
+    u15 A
+
+Y' u15
+
+bytes/pixel
+    2
+model
+    Y'
+components
+
+    u15  Y'
+
+YA u32
+
+bytes/pixel
+    8
+model
+    YA
+components
+
+    u32  Y
+    u32  A
+
+YaA u32
+
+bytes/pixel
+    8
+model
+    YaA
+components
+
+    u32  Ya
+    u32  A
+
+Y u32
+
+bytes/pixel
+    4
+model
+    Y
+components
+
+    u32  Y
+
+Y'A u32
+
+bytes/pixel
+    8
+model
+    Y'A
+components
+
+    u32  Y'
+    u32  A
+
+Y'aA u32
+
+bytes/pixel
+    8
+model
+    Y'aA
+components
+
+    u32 Y'a
+    u32 A
+
+Y' u32
+
+bytes/pixel
+    4
+model
+    Y'
+components
+
+    u32  Y'
+
 Y'CbCr double
 
 bytes/pixel
@@ -1147,18 +1643,55 @@ components
     float CIE H(ab)
     float A
 
-cairo-ARGB32
+HSVA double
 
 bytes/pixel
-    4
+    32
 model
-    R'aG'aB'aA
+    HSVA
 components
 
-    u8 B'a
-    u8 G'a
-    u8 R'a
-    u8 A
+    double hue
+    double saturation
+    double value
+    double alpha
+
+HSV double
+
+bytes/pixel
+    24
+model
+    HSV
+components
+
+    double hue
+    double saturation
+    double value
+
+HSVA float
+
+bytes/pixel
+    16
+model
+    HSVA
+components
+
+    float hue
+    float saturation
+    float value
+    float alpha
+
+HSV float
+
+bytes/pixel
+    12
+model
+    HSV
+components
+
+    float hue
+    float saturation
+    float value
 
 cairo-RGB24
 
@@ -1173,6 +1706,19 @@ components
     u8 R'
     u8 PAD
 
+cairo-ARGB32
+
+bytes/pixel
+    4
+model
+    R'aG'aB'aA
+components
+
+    u8 B'a
+    u8 G'a
+    u8 R'a
+    u8 A
+
 cairo-A8
 
 bytes/pixel
@@ -1196,6 +1742,18 @@ components
     double yellow
     double key
 
+CMY double
+
+bytes/pixel
+    24
+model
+    CMY
+components
+
+    double cyan
+    double magenta
+    double yellow
+
 CMYK float
 
 bytes/pixel
@@ -1205,10 +1763,85 @@ model
 components
 
     float cyan
-    float yellow
     float magenta
+    float yellow
     float key
 
+CMY float
+
+bytes/pixel
+    12
+model
+    CMY
+components
+
+    float cyan
+    float magenta
+    float yellow
+
+CMYK u8
+
+bytes/pixel
+    4
+model
+    CMYK
+components
+
+    u8 cyan
+    u8 magenta
+    u8 yellow
+    u8 key
+
+Y'CbCr709 double
+
+bytes/pixel
+    24
+model
+    Y'CbCr709
+components
+
+    double  Y'
+    double  Cb
+    double  Cr
+
+Y'CbCrA709 double
+
+bytes/pixel
+    32
+model
+    Y'CbCrA709
+components
+
+    double  Y'
+    double  Cb
+    double  Cr
+    double  alpha
+
+Y'CbCrA709 float
+
+bytes/pixel
+    16
+model
+    Y'CbCrA709
+components
+
+    float Y'
+    float Cb
+    float Cr
+    float alpha
+
+Y'CbCr709 float
+
+bytes/pixel
+    12
+model
+    Y'CbCr709
+components
+
+    float  Y'
+    float  Cb
+    float  Cr
+
 B'aG'aR'aA u8
 
 bytes/pixel
@@ -1222,6 +1855,56 @@ components
     u8 R'a
     u8 A
 
+HSLA double
+
+bytes/pixel
+    32
+model
+    HSLA
+components
+
+    double hue
+    double saturation
+    double lightness
+    double alpha
+
+HSL double
+
+bytes/pixel
+    24
+model
+    HSL
+components
+
+    double hue
+    double saturation
+    double lightness
+
+HSLA float
+
+bytes/pixel
+    16
+model
+    HSLA
+components
+
+    float hue
+    float saturation
+    float lightness
+    float alpha
+
+HSL float
+
+bytes/pixel
+    12
+model
+    HSL
+components
+
+    float hue
+    float saturation
+    float lightness
+
 Shortcut Coverage
 
 The diagram shown below visualizes the coverage of current shortcut
@@ -1230,80 +1913,131 @@ height of the bar indicates the number of conversions steps needed in a
 chain of conversions. A DHTML version is also available.
 
 
-    ··▂▂·▁··   ··· ▁ ▁  ▂             ▁▁   ▁         ····         ·  ── 0 RGBA double
-                                                                     ── 1 RGB double
-                                                                     ── 2 RaGaBaA double
-                                                                     ── 3 R'G'B' double
-·    ▁▁▁▁▂▁▁   ▁▁▁ · ▂  ▁             ▂▂   ▂         ▁▁▁▁         ▁  ── 4 R'G'B'A double
-·     ▃▃▁▂▁▁   ▁▁▁ ▂    ▃             ▂▂   ▂         ▁▁▁▁         ▁  ── 5 R'aG'aB'aA double
-▂   ▂  ··▂▃▃   ▂▃▂ ▁ ▁ ··             ▁▂ ▃ ▂         ▂▂▃▃         ▃  ── 6 R'G'B' u8
-▁   ▁▂  ·▁▃▂   ▃▃▂ · ▁  ▁             ▁▁   ▁         ▂▂▃▂         ▃  ── 7 R'G'B'A u8
-·   ▁▁▁  ·▁▁   ▁▁▁ ▂ ·  ▁             ··   ·         ▁▁▁▁         ▁  ── 8 RGBA float
-▁   ▂▂▂▂  ▂▂   ▂▂▂ ▃ ▁ ▃·             ▁· ▂ ▁         ▂▃▂▂         ▂  ── 9 RGB float
-·   ▁▁▃▃▁  ▁   ▁▁▁ ▂ ▃  ▃             ▂▂ ▃ ▂         ▁▁▁▁         ▁  ──10 Y double
-·   ▁▁▃▃▁▂     ▁▁▁ ▂ ▂  ▃             ▂▂   ▂         ▁▁▁▁         ▁  ──11 YA double
-                                                                     ──12 YaA double
-                                                                     ──13 Y' double
-                                                                     ──14 Y'A double
-·   ▁▁▃▃▁▂▁▁    ▁▁ ▂ ▂  ▃             ▂▂   ▂         ▁▁▁▁         ▁  ──15 Y'aA double
-·   ▁▁▃▃▁▂▁▁     ▁ ▂ ▃  ▃             ▃▂ ▃ ▂         ▁▁▁▁         ▁  ──16 Y'CbCr double
-    ▁▁▃▃▁▂▁▁   ▁   ▂ ▂  ▃             ▂▂   ▂         ▁▁▁▁         ▁  ──17 Y'CbCrA double
-                                                                     ──18 Y'CbCr u8
-▁   ·▂···▁▂▂   ▃▂▂   ▁  ·             ▁▁   ▃         ▂▂▂▂         ▂  ──19 R'G'B'A float
-▂   ▁▃▁▁▁▂▃▃   ▃▃▃   ▁  ▁             ▂▂   ▃         ▃▃▃▃         ▃  ──20 R'G'B'A u16
-      ▁▁                              ▂    ▃         ▃▃▃▃            ──21 R'aG'aB'aA float
-▃   ▂   ▂▃         ▁    ▂             ▃▃   ▃                         ──22 R'aG'aB'aA u16
-▃   ▂   ▂▃         ▁ ·  ▂             ▃▃   ▃                         ──23 R'aG'aB'aA u8
-▃   ▁▃▁▁▁▃▃▃   ▃▃▃ · ·                ▃▃ ▃ ▃         ▃▃▃▃         ▃  ──24 R'G'B' float
-▃   ▂ ▂▃▃▁         ▁ ▁ ▃              ▃▃   ▃                         ──25 R'G'B' u16
-    ▁ ▃▁           · ▁  ▁  ·· ▂  ▁                                   ──26 Y'A float
-    ▂ ▂▂           ▁ ·  ▂   ▁ ▁  ·                                   ──27 Y'aA float
-    ▂ ▂▂           ▁ ▂ ▃▃ ·                                          ──28 Y' float
-    ▂ ▂▂           ▁ ▂  ▂ ·▁  ▃  ▂                                   ──29 Y'A u16
-    ▃ ▃▃           ▂ ▁  ▃ ▁·▂    ▁                                   ──30 Y'aA u16
-    ▃ ▃▃           ▃ ▂  ▁ ▁▁·                                        ──31 Y' u16
-▂   ▂▂▂▂▁▁▃▃   ▂▃▂ ▁ ▂  ▂ ·▁▁ ▃  ▃    ▂▂   ▁·▁▁      ▂▃▂▂         ▂  ──32 Y'A u8
-    ▃              ▂ ▁  ▃ ▁·▂ ·                                      ──33 Y'aA u8
-▃   ▃▂▃▃▃▃▂▂   ▂▂▂ ▂ ▂ ▃▁ ▁▁·         ▃▃ ▂ ▁▁▂·      ▂▂▂▂         ▂  ──34 Y' u8
-▃   ▂ ▂▂▃▁         ▁ ▁ ▃·             ▃▃   ▃                         ──35 Y'CbCr float
-▂   ▁▃▁▁▁▂▃▃   ▃▃  · ▂  ▁             ▂▂   ▃         ▃▃▃▃         ▃  ──36 Y'CbCrA float
-▁   ▂▂▂▂·▁▂▂   ▂▂▂ ▁ ▁  ▂             ▁▁   ▁         ▂▂▂▂         ▂  ──37 RGBA u16
-▁   ▂▂▂▂·▁▂▂   ▂▂▂ ▁ ▁  ▂              ▁   ·         ▃▂▂▂         ▂  ──38 RGBA u8
-▁   ▂▂▂▂·▁▂▂   ▂▂▂ ▁ ▁  ▂                  ▁         ▂▂▂▂         ▂  ──39 RaGaBaA float
-▂   ▃▃▃▃▁▂▃▃   ▃▃▃ ▂ ▂  ▃             ▂    ▂         ▃▃▃▃         ▃  ──40 RaGaBaA u16
-▂   ▃▃▃▃▁▂▃▃   ▃▃▃ ▂ ▂  ▃              ·             ▃▃▃▃         ▃  ──41 RaGaBaA u8
-▂   ▃▃▃▃▁·▃▃   ▃▃▃ ▂ ▃  ▁             ▃▂   ▂         ▃▃▃▃         ▃  ──42 RGB u16
-▁   ▂▃▃▃▁·▂▃   ▃▃▂ ▂ ▃ ▃▁             ·▁ ·           ▃▃▃▃         ▃  ──43 RGB u8
-▁   ▂▂▂▂·▁▂    ▂▂▂ ▁ ▁  ▂             ▁▁     ··      ▂▂▂▂         ▂  ──44 YA float
-▂   ▃▃▃▃▁▂▃▃   ▃▃▃ ▂ ▂  ▃             ▂·   ▂         ▃▃▃▃         ▃  ──45 YaA float
-▂   ▃▃▃▃▃▂ ▃   ▃▃▃ ▂ ▂  ▃             ▂▂ ▃ ▂·        ▃▃▃▃         ▃  ──46 Y float
-▂   ▃▃▃▃▁▂▃▃   ▃▃▃ ▂ ▂  ▃             ▂▂   ▂·▁       ▃▃▃▃         ▃  ──47 YA u16
-▃       ▂▃         ▃ ▃                ▃▁   ▃ ·                       ──48 YaA u16
-▃       ▂▁         ▃ ▃  ▂             ▃▂   ▃▁▁·                      ──49 Y u16
-▁   ▃▃▃▃·▂▃▃   ▃▃▃ ▁ ▁  ▂             ▂▂   ▁·▁▁      ▃▂▃▃         ▂  ──50 YA u8
-▃       ▂▃         ▃ ▃                 ▁    ▁·▂                      ──51 YaA u8
-▁   ▂▂▂▃▂▁▂▂   ▂▂▂ ▁ ▃ ▃▂             ▃▃ ▂ ▃▁▁·      ▂▂▂▂         ▂  ──52 Y u8
-·   ▁▁▃▃▁▂▁▁   ▁▁▁ ▂ ▃  ▃             ▂▂ ▃ ▂          ▁▁▁         ▁  ──53 CIE Lab double
-·   ▁▁▃▃▁▂▁▁   ▁▁▁ ▂ ▂  ▃             ▂▂   ▂           ▁          ▁  ──54 CIE Lab alpha double
-·   ▁▁▃▃▁▂▁▁   ▁▁▁ ▂ ▃  ▃             ▂▂ ▃ ▂         ▁  ▁         ▁  ──55 CIE LCH(ab) double
-·   ▁▁▃▃▁▂▁▁   ▁▁▁ ▂ ▂  ▃             ▂▂   ▂         ▁▁           ▁  ──56 CIE LCH(ab) alpha double
-                                                                     ──57 CIE Lab float
-                                                                     ──58 CIE Lab alpha float
-                                                                     ──59 CIE Lab u8
-                                                                     ──60 CIE Lab u16
-                                                                     ──61 CIE LCH(ab) float
-                                                                     ──62 CIE LCH(ab) alpha float
-                                                                     ──63 cairo-ARGB32
-                                                                     ──64 cairo-RGB24
-                                                                     ──65 cairo-A8
-·   ▁▁▃▃▁▂▁▁   ▁▁▁ ▂ ▃  ▃             ▃▂ ▃ ▂         ▁▁▁▁            ──66 CMYK double
-                                                                     ──67 CMYK float
-                                                                     ──68 B'aG'aR'aA u8
-|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-||||||||||11111111112222222222333333333344444444445555555555666666666
-012345678901234567890123456789012345678901234567890123456789012345678
-total length: 2751
-total cost  : 504960
+    ▂·▁▂·▁                  ··   ·                  ·· ▁▂▂▃▃▂ ▂▃▂   ▃ ▃  ▁▁▁▂▂ ▂▁▂▁   ▂ ▂····      ··  ▁▁ ··   ··   ··  ── 0 RGBA double
+                                                                                                                        ── 1 RGB double
+                                                                                                                        ── 2 RaGaBaA double
+                                                                                                                        ── 3 R'G'B' double
+▂    ▃▂▁▁▂                  ▃▃   ▃                  ▃▃ ·▁▁▂▂▁ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃ ▃▃▃▃▃      ▃▃  ▂▃ ▃▃   ▃▃   ▃▃  ── 4 R'G'B'A double
+·     ▂▃▁▂                  ▁▁   ▁                  ▁▁ ▂▃   ▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃ ▃▁▁▁▁      ▁▁  ▃  ▁▁   ▁▁   ▁▁  ── 5 R'aG'aB'aA double
+▁   ▁  ···                  ▂▂   ▂                  ▂▂ ·▁▁▁···▂▃▂   ▃ ▃  ▁▁·▁▂▁▁▁▂▁   ▂ ▂▂▂▂▂      ▂▂  ·▁ ▂▂   ▂▂   ▂▂  ── 6 R'G'B' u8
+▁   ▁▂  ·▁                  ▂▂   ▂                  ▂▂ ▁·▁▂·▁▁▂▃▂   ▃ ▃  ▁▁▁▂▁▁▂▁▂▁   ▂ ▂▂▂▂▂      ▂▂  ·▁ ▂▂   ▂▂   ▂▂  ── 7 R'G'B'A u8
+·   ▁▁·  ·                  ▁▁   ▁                  ▁▁ ·▁▁▂▂▁ ▁▂▁   ▂▃▂  ···▁▁ ▁·▁·   ▁ ▁▁▁▁▁      ▁▁  ·· ▁▁   ▁▁   ▁▁  ── 8 RGBA float
+▁   ▂▂▁▂                    ▂▂   ▂                  ▂▂ ▁▂▂▃▂· ▂▃▂   ▃ ▃  ▁▁·▁▁ ·▁▂▁   ▂ ▂▂▂▂▂      ▂▂  ▂▃ ▂▂   ▂▂   ▂▂  ── 9 RGB float
+                                                                                                                        ──10 RGB half
+                                                                                                                        ──11 RGBA half
+                                                                                                                        ──12 RaGaBaA half
+                                                                                                                        ──13 R'G'B' half
+                                                                                                                        ──14 R'G'B'A half
+                                                                                                                        ──15 R'aG'aB'aA half
+                                                                                                                        ──16 RGB u15
+                                                                                                                        ──17 RGBA u15
+                                                                                                                        ──18 RaGaBaA u15
+                                                                                                                        ──19 R'G'B' u15
+                                                                                                                        ──20 R'G'B'A u15
+                                                                                                                        ──21 R'aG'aB'aA u15
+                                                                                                                        ──22 RGB u32
+                                                                                                                        ──23 RGBA u32
+                                                                                                                        ──24 RaGaBaA u32
+                                                                                                                        ──25 R'G'B' u32
+                                                                                                                        ──26 R'G'B'A u32
+                                                                                                                        ──27 R'aG'aB'aA u32
+·   ▃▁▂▃▁▂                   ▁   ▁                  ▁▁ ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃    ▃ ▃▁▁▁▁      ▁▁  ▃▂ ▁▁   ▁▁   ▁▁  ──28 Y double
+·   ▃▁▂▃▁▂                       ▁                  ▁▁ ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃ ▃▂   ▃ ▃▁▁▁▁      ▁▁  ▂  ▁▁   ▁▁   ▁▁  ──29 YA double
+                                                                                                                        ──30 YaA double
+                                                                                                                        ──31 Y' double
+                                                                                                                        ──32 Y'A double
+·   ▃▁▂▃▁▂                  ▁▁                      ▁▁ ▃▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▂▃▃▃     ▂▁▁▁▁      ▁▁  ▂  ▁▁   ▁▁   ▁▁  ──33 Y'aA double
+                                                                                                                        ──34 YA half
+                                                                                                                        ──35 YaA half
+                                                                                                                        ──36 Y half
+                                                                                                                        ──37 Y'A half
+                                                                                                                        ──38 Y'aA half
+                                                                                                                        ──39 Y' half
+                                                                                                                        ──40 YA u15
+                                                                                                                        ──41 YaA u15
+                                                                                                                        ──42 Y u15
+                                                                                                                        ──43 Y'A u15
+                                                                                                                        ──44 Y'aA u15
+                                                                                                                        ──45 Y' u15
+                                                                                                                        ──46 YA u32
+                                                                                                                        ──47 YaA u32
+                                                                                                                        ──48 Y u32
+                                                                                                                        ──49 Y'A u32
+                                                                                                                        ──50 Y'aA u32
+                                                                                                                        ──51 Y' u32
+·   ▃▁▃▃▁▂                  ▁▁   ▁                   ▁ ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃ ▃▁▁▁▁      ▁▁  ▃  ▁▁   ▁▁   ▁▁  ──52 Y'CbCr double
+·   ▃▁▂▃▁▂                  ▁▁   ▁                     ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃ ▃▁▁▁▁      ▁▁  ▃▂ ▁▁   ▁▁   ▁▁  ──53 Y'CbCrA double
+                                                                                                                        ──54 Y'CbCr u8
+▁   ·▂▁··▁                  ▂▂   ▃                  ▂▂  ··▁▁· ▂▃▂   ▃ ▃  ▁▁▁▂▂ ▂▁▂▁   ▂ ▂▂▂▂▂      ▂▂  ▁▂ ▂▂   ▂▂   ▂▂  ──55 R'G'B'A float
+▂   ▁▃▂▁▁▂                  ▃▃   ▃                  ▃▃   ·▁▁▁▁▃ ▃   ▃ ▃  ▂▂▂▃▂▂▃▂▃▂   ▃ ▃▃▃▃▃      ▃▃  ▂▂ ▃▃   ▃▃   ▃▃  ──56 R'G'B'A u16
+▂   ▁ ▂▁▁▂                  ▃▃   ▃                  ▃▃ ·  ··▁ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃ ▃▃▃▃▃      ▃▃  ▂▁ ▃▃   ▃▃   ▃▃  ──57 R'aG'aB'aA float
+▃   ▂ ▃▂▂▃                                             ▁▂  ·▂▂           ▃▃▃ ▃▃▃▃ ▃     ▃              ▃▁               ──58 R'aG'aB'aA u16
+▃   ▂   ▂▃                                             ▁▂·  ▂▂           ▃▃▃ ▃▃▃▃ ▃     ▃               ·               ──59 R'aG'aB'aA u8
+▂   ▃▃·▁▁·                  ▃▃   ▃                  ▃▃ ▂▃▃▃   ▃ ▃   ▃ ▃  ▂▂▁▂▂ ▁▂▃▂   ▃ ▃▃▃▃▃      ▃▃  ▁▂ ▃▃   ▃▃   ▃▃  ──60 R'G'B' float
+▃     ·▁▂▁                                             ▃ ▃ ▁             ▃▃▂▃▃▃▂▃ ▃     ▃              ▁▂               ──61 R'G'B' u16
+▂   ▁▃▂▁▁▂                  ▃▃   ▃                  ▃▃ ·▁▁▂▂▁  ·· ▂ ·▁▁  ▂▂▂▃▃ ▃·▁▁   ▁ ▂▃▃▃▃      ▃▃  ▃▃ ▃▃   ▃▃   ▃▃  ──62 Y'A float
+▃   ▂ ▃▂▃▃                                             ▁▂·▁▁▂   ▁ ▁ ▂·▃  ▃▃▃   ▃▃▃▃     ▃              ▃▂               ──63 Y'aA float
+▃   ▂ ▁▂▂▁                                             ▁▂▁▃▂· ·     ▁ ·  ▃▃▂▃▃ ▂▁▁·   ▂ ▁              ▂▃               ──64 Y' float
+▃   ▂ ▃▂▂▃                       ▃                     ▁▂▂▃▂▂▂·▁  ▃ ·▂▂  ▃▃▃ ▃▃▃▁▂▂   ▂ ▃              ▃▃               ──65 Y'A u16
+    ▃  ▃▃                                              ▂▃▁▂▃▃ ▁·▂    ▁          ▃▃▃                     ▃               ──66 Y'aA u16
+    ▃ ▂▃▃▂                                             ▂▃▂▃▃▁▃▁▁·   ▂▃·    ▃   ▃▂▂▁   ▃ ▂              ▃▂               ──67 Y' u16
+▁   ▂▂▃▂·▁                  ▂▂   ▂                  ▂▂ ▁▃▂▃▃▂▂·▁▁·▃  ▂▂  ▁▁▁▂▁▁▂·▁▁   ▁ ▂▂▂▂▂      ▂▂  ▃▃ ▂▂   ▃▂   ▂▂  ──68 Y'A u8
+    ▃   ▃                                              ▂▃▁▂▃▃ ▁·▂ ·             ▃▃▃                     ▃               ──69 Y'aA u8
+▁   ▃▂▂▃·▁                  ▂▂   ▂                  ▂▂ ▂▃▂▃▃▁▃▁▁·▃▃·▂    ▁▁▁▂▂▁▂▁▁·   ▂ ▁▂▂▂▂      ▂▂  ▃▃ ▂▂   ▂▂   ▂▂  ──70 Y' u8
+▃     ▁▂▂▁                                             ▃ ▃ ▂·            ▃▃▂▃▃ ▂▃ ▃     ▃              ▂▃               ──71 Y'CbCr float
+▂   ▁▃▂▁▁▂                  ▃▃   ▃                  ▃  ·▁▁▂▂▁ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃ ▃▃▃▃▃      ▃▃  ▂▃ ▃▃   ▃▃   ▃▃  ──72 Y'CbCrA float
+▁   ▂▂▂▂·▁                  ▂▂   ▂                  ▂▂ ▁▂▂▃▂▂▂▂▃▂   ▃ ▃   ▁·▁▁▁▂▁▂▁   ▂ ▂▂▂▂▂      ▂▃  ▂▂ ▂▂   ▂▂   ▂▃  ──73 RGBA u16
+▁   ▂▂▃▂·▁                  ▂▂   ▂                  ▂▂ ▁▂▂▃▂▂▂▂▃▂   ▃ ▃    ·▂·▁·▁▂▁   ▂ ▂▂▂▂▂      ▂▂  ▃▂ ▃▂   ▂▂   ▂▂  ──74 RGBA u8
+▁   ▂▂▁▂·▁                  ▂▂   ▂                  ▂▂ ▁▂▂▃▃▂ ▂▃▂   ▃ ▃  ▁  ·· ▂▁▂▁   ▂ ▂▂▂▂▂      ▂▂  ▁▁ ▂▂   ▂▂   ▂▂  ──75 RaGaBaA float
+▂   ▃▃▂▃▁▂                  ▃▃   ▃                  ▃▃ ▂▃▃▂▃▃▃▃ ▃   ▃ ▃  ▂▂  ·▂▃▂▃▂   ▃ ▃▃▃▃▃      ▃▃  ▂▂ ▃▃   ▃▃   ▃▃  ──76 RaGaBaA u16
+▂   ▃▃▂▃▁▂                  ▃▃   ▃                  ▃▃ ▂▃▃▂▃▃▃▃ ▃   ▃ ▃  ▂ ·  ▂ ▂▃▂   ▃ ▃▃▃▃▃          ▂▂ ▃▃   ▃▃   ▃▃  ──77 RaGaBaA u8
+▂   ▃▃▂▃▁·                  ▃▃   ▃                  ▃▃ ▂▃▃▃▃▁▃▃ ▃   ▃ ▃  ▂▂▁▂  ·▂▃▂   ▃ ▃▃▃▃▃      ▃▃  ▃▃ ▃▃   ▃▃   ▃▃  ──78 RGB u16
+▁   ▂▂▂▃··                  ▂▂   ▂                  ▂▂ ▁▂▃▃▃▁▂▂▃▂   ▃ ▃  ▁··▁·  ▁▂▁   ▂ ▂▂▂▂▂      ▂▂  ▃▃ ▂▂   ▂▂   ▂▂  ──79 RGB u8
+▁   ▂▂▃▂·▁                  ▂    ▂                  ▂▂ ▁▂▂▃▃▂ ·▂▁ ▃ ▁▃▂  ▁▁▁▂▂   ··   · ▁▂▂▂▂      ▂▂  ▁▃ ▂▂   ▂▂   ▂▂  ──80 YA float
+▂   ▃▃▂▃▁▂                  ▃▃   ▃                  ▃▃ ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂·▁▁ ▃  ▂   ▃ ▃▃▃▃▃      ▃▃  ▂  ▃▃   ▃▃   ▃▃  ──81 YaA float
+▂   ▃▃▂▃▁·                   ▃   ▃                  ▃▃ ▂▃▂▃▃▁ ▁▁·   ▂▃▁  ▂▂▁▂▂ ▁·     ▁ ·▃▃▃▃      ▃▃  ▃▃ ▃▃   ▃▃   ▃▃  ──82 Y float
+▂   ▃▃▂▃▁▂                  ▃▃   ▃                  ▃▃ ▂▃▃▃▃▃▃▁▂▂   ▂▃▃  ▂▂▂▃▂▂▃·▁    · ▂▃▃▃▃      ▃▃  ▂▂ ▃▃   ▃▃   ▃▃  ──83 YA u16
+▃     ▃ ▂▃                                             ▃ ▂▃▃             ▃▃▁▂▃▃▃▃·▃     ▃              ▃                ──84 YaA u16
+▃     ▃▃▂▁                                             ▃ ▃ ▃▂ ▂▂▁   ▃ ▂  ▃▂▂▃▃▃▂▁▁·   ▂ ▁              ▂▃               ──85 Y u16
+▁   ▃▂▃▃·▁                  ▂▂   ▂                  ▂▂ ▂▃▃▃▃▃▃▁▂▂   ▂▃▃  ▂▁▁▂▂▁▂·▁▁·    ▂▂▂▂▂      ▂▂  ▃▃ ▂▂   ▂▂   ▂▂  ──86 YA u8
+▃     ▃ ▂▃                                             ▃ ▂▃▃             ▃▃▁▂▃▃▃▃·▃ ·   ▃              ▃▃               ──87 YaA u8
+▁   ▂▂▃▂·▁                   ▂   ▂                  ▂▂ ▃▂▃▃▃▂▂▂▂▁   ▃ ▂  ▂▁▁▃▂▃▂▁▁·▃ ·▂  ▂▂▂▂      ▂▂  ▃▃ ▂▂   ▂▂   ▂▂  ──88 Y u8
+·   ▃▁▃▃▁▂                  ▁▁   ▁                  ▁▁ ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃   ▁▁▁      ▁▁  ▃  ▁▁   ▁▁   ▁▁  ──89 CIE Lab double
+·   ▃▁▂▃▁▂                  ▁▁   ▁                  ▁▁ ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃ ▃  ▁▁      ▁▁  ▃▂ ▁▁   ▁▁   ▁▁  ──90 CIE Lab alpha double
+·   ▃▁▃▃▁▂                  ▁▁   ▁                  ▁▁ ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃ ▃▁  ▁      ▁▁  ▃  ▁▁   ▁▁   ▁▁  ──91 CIE LCH(ab) double
+·   ▃▁▂▃▁▂                  ▁▁   ▁                  ▁▁ ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃ ▃▁▁        ▁▁  ▃▂ ▁▁   ▁▁   ▁▁  ──92 CIE LCH(ab) alpha double
+                                                                                                                        ──93 CIE Lab float
+                                                                                                                        ──94 CIE Lab alpha float
+                                                                                                                        ──95 CIE Lab u8
+                                                                                                                        ──96 CIE Lab u16
+                                                                                                                        ──97 CIE LCH(ab) float
+                                                                                                                        ──98 CIE LCH(ab) alpha float
+·   ▃▁▂▃▁▂                  ▁▁   ▁                  ▁▁ ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃ ▃▁▁▁▁       ▁  ▂▂ ▁▁   ▁▁   ▁▁  ──99 HSVA double
+·   ▃▁▃▃▁▂                  ▁▁   ▁                  ▁▁ ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▃▃▂   ▃ ▃▁▁▁▁          ▃  ▁▁   ▁▁   ▁▁  ──100 HSV double
+                                                                                                                        ──101 HSVA float
+                                                                                                                        ──102 HSV float
+                                                                                                                        ──103 cairo-RGB24
+                                                                                                                        ──104 cairo-ARGB32
+                                                                                                                        ──105 cairo-A8
+·   ▃▁▃▃▁▂                  ▁▁   ▁                  ▁▁ ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃ ▃▁▁▁▁      ▁▁  ▃   ▁   ▁▁   ▁▁  ──106 CMYK double
+·   ▃▁▃▃▁▂                  ▁▁   ▁                  ▁▁ ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃ ▃▁▁▁▁      ▁▁  ▃       ▁▁   ▁▁  ──107 CMY double
+                                                                                                                        ──108 CMYK float
+                                                                                                                        ──109 CMY float
+                                                                                                                        ──110 CMYK u8
+·   ▃▁▃▃▁▂                  ▁▁   ▁                  ▁▁ ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃ ▃▁▁▁▁      ▁▁  ▃  ▁▁    ▁   ▁▁  ──111 Y'CbCr709 double
+·   ▃▁▂▃▁▂                  ▁▁   ▁                  ▁▁ ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃ ▃▁▁▁▁      ▁▁  ▂▂ ▁▁        ▁▁  ──112 Y'CbCrA709 double
+                                                                                                                        ──113 Y'CbCrA709 float
+                                                                                                                        ──114 Y'CbCr709 float
+                                                                                                                        ──115 B'aG'aR'aA u8
+·   ▃▁▂▃▁▂                  ▁▁   ▁                  ▁▁ ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃ ▃▁▁▁▁      ▁▁  ▂▂ ▁▁   ▁▁    ▁  ──116 HSLA double
+·   ▃▁▃▃▁▂                  ▁▁   ▁                  ▁▁ ▂▃▃▃▃▃ ▃ ▃   ▃ ▃  ▂▂▂▃▃ ▃▂▃▂   ▃ ▃▁▁▁▁      ▁▁  ▃  ▁▁   ▁▁       ──117 HSL double
+                                                                                                                        ──118 HSLA float
+                                                                                                                        ──119 HSL float
+||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+||||||||||11111111112222222222333333333344444444445555555555666666666677777777778888888888999999999900000000001111111111
+012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+total length: 7178
+total cost  : 4640499
 
 Environment
 
@@ -1405,5 +2139,30 @@ Daniel Paredes García danipga at gmail.com
     Initial work to make babl threadsafe
 Rupert Weber gimp at leguanease.org
     Documentation and other improvements
-
-/babl-0.1.10
+Jehan jehan at girinstud.io
+    win32 portabilitiy
+Sven Claussner
+    Update DOAP file
+Alexander Larsson
+    Math optimizations
+Nils Philippsen
+    code cleanups
+Simon Budig
+    cleanups
+Micheal Muré
+    portability fixes
+Maxime Nicco
+
+    HSV color model extension
+
+Teo Mazars
+    Color spaces/models in extensions
+Daniel Sabo
+    Dead code elimination, general cleanups,
+Michael Henning
+    Conversion fixes
+Elle Stone
+    Verification and improvements to accuracy of color space
+    conversions.
+
+/babl-0.1.12
index cbd01769c8d3f5cc70b4415abd201577ba631cee..a7afae4b11820a834d484191a14a03e57dba8c45 100644 (file)
@@ -1,4 +1,4 @@
-# generated automatically by aclocal 1.11.3 -*- Autoconf -*-
+# generated automatically by aclocal 1.11.6 -*- Autoconf -*-
 
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
 # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
 
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
-[m4_warning([this file was generated for autoconf 2.68.
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
 You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically `autoreconf'.])])
 
-# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
-# serial 1 (pkg-config-0.24)
-# 
-# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# PKG_PROG_PKG_CONFIG([MIN-VERSION])
-# ----------------------------------
-AC_DEFUN([PKG_PROG_PKG_CONFIG],
-[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
-m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
-m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
-AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
-AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
-AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
-
-if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
-       AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
-fi
-if test -n "$PKG_CONFIG"; then
-       _pkg_min_version=m4_default([$1], [0.9.0])
-       AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
-       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
-               AC_MSG_RESULT([yes])
-       else
-               AC_MSG_RESULT([no])
-               PKG_CONFIG=""
-       fi
-fi[]dnl
-])# PKG_PROG_PKG_CONFIG
-
-# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
-#
-# Check to see whether a particular set of modules exists.  Similar
-# to PKG_CHECK_MODULES(), but does not set variables or print errors.
-#
-# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
-# only at the first occurence in configure.ac, so if the first place
-# it's called might be skipped (such as if it is within an "if", you
-# have to call PKG_CHECK_EXISTS manually
-# --------------------------------------------------------------
-AC_DEFUN([PKG_CHECK_EXISTS],
-[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
-if test -n "$PKG_CONFIG" && \
-    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
-  m4_default([$2], [:])
-m4_ifvaln([$3], [else
-  $3])dnl
-fi])
-
-# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
-# ---------------------------------------------
-m4_define([_PKG_CONFIG],
-[if test -n "$$1"; then
-    pkg_cv_[]$1="$$1"
- elif test -n "$PKG_CONFIG"; then
-    PKG_CHECK_EXISTS([$3],
-                     [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
-                     test "x$?" != "x0" && pkg_failed=yes ],
-                    [pkg_failed=yes])
- else
-    pkg_failed=untried
-fi[]dnl
-])# _PKG_CONFIG
-
-# _PKG_SHORT_ERRORS_SUPPORTED
-# -----------------------------
-AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
-[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
-if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
-        _pkg_short_errors_supported=yes
-else
-        _pkg_short_errors_supported=no
-fi[]dnl
-])# _PKG_SHORT_ERRORS_SUPPORTED
-
-
-# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
-# [ACTION-IF-NOT-FOUND])
-#
-#
-# Note that if there is a possibility the first call to
-# PKG_CHECK_MODULES might not happen, you should be sure to include an
-# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
-#
-#
-# --------------------------------------------------------------
-AC_DEFUN([PKG_CHECK_MODULES],
-[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
-AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
-AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
-
-pkg_failed=no
-AC_MSG_CHECKING([for $1])
-
-_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
-_PKG_CONFIG([$1][_LIBS], [libs], [$2])
-
-m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
-and $1[]_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.])
-
-if test $pkg_failed = yes; then
-       AC_MSG_RESULT([no])
-        _PKG_SHORT_ERRORS_SUPPORTED
-        if test $_pkg_short_errors_supported = yes; then
-               $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
-        else 
-               $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
-        fi
-       # Put the nasty error message in config.log where it belongs
-       echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
-
-       m4_default([$4], [AC_MSG_ERROR(
-[Package requirements ($2) were not met:
-
-$$1_PKG_ERRORS
-
-Consider adjusting the PKG_CONFIG_PATH environment variable if you
-installed software in a non-standard prefix.
-
-_PKG_TEXT])[]dnl
-        ])
-elif test $pkg_failed = untried; then
-       AC_MSG_RESULT([no])
-       m4_default([$4], [AC_MSG_FAILURE(
-[The pkg-config script could not be found or is too old.  Make sure it
-is in your PATH or set the PKG_CONFIG environment variable to the full
-path to pkg-config.
-
-_PKG_TEXT
-
-To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
-        ])
-else
-       $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
-       $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
-        AC_MSG_RESULT([yes])
-       $3
-fi[]dnl
-])# PKG_CHECK_MODULES
-
 # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
 # Foundation, Inc.
 #
@@ -198,7 +38,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
 [am__api_version='1.11'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.3], [],
+m4_if([$1], [1.11.6], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -214,7 +54,7 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.3])dnl
+[AM_AUTOMAKE_VERSION([1.11.6])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
@@ -1226,7 +1066,6 @@ AC_SUBST([am__tar])
 AC_SUBST([am__untar])
 ]) # _AM_PROG_TAR
 
-m4_include([m4/introspection.m4])
 m4_include([m4/libtool.m4])
 m4_include([m4/ltoptions.m4])
 m4_include([m4/ltsugar.m4])
index cefab57238d77336e24aef7c212d4ea312fb81cf..4f59447c3da7fd5ed10579fa78684b1f1a4858d5 100644 (file)
@@ -28,6 +28,7 @@ c_sources =                           \
        babl-model.c                    \
        babl-mutex.c                    \
        babl-palette.c    \
+       babl-ref-pixels.c               \
        babl-sampling.c                 \
        babl-sanity.c                   \
        babl-type.c                     \
@@ -56,6 +57,7 @@ h_sources  =                          \
        babl-memory.h                   \
        babl-model.h                    \
        babl-mutex.h                    \
+       babl-ref-pixels.h               \
        babl-sampling.h                 \
        babl-type.h                     \
        babl-types.h                    \
@@ -63,6 +65,7 @@ h_sources  =                          \
 
 library_includedir=$(includedir)/babl-$(BABL_API_VERSION)/babl
 libinc_hdrs = \
+       babl-introspect.h       \
        babl-macros.h           \
        babl-types.h            \
        babl.h
@@ -86,49 +89,5 @@ libbabl_@BABL_API_VERSION@_la_LDFLAGS=               \
        ${no_undefined} $(MATH_LIB)     \
        -version-info $(BABL_LIBRARY_VERSION)
 
-# GObject Introspection
--include $(INTROSPECTION_MAKEFILE)
-INTROSPECTION_GIRS =
-INTROSPECTION_SCANNER_ARGS = --add-include-path=$(srcdir)
-INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
-
-if HAVE_INTROSPECTION
-Babl-$(BABL_API_VERSION).gir: $(G_IR_SCANNER) $(library_include_HEADERS) $(c_sources) $(srcdir)/Makefile.am
-       $(INTROSPECTION_SCANNER) -v --namespace Babl --nsversion=$(BABL_API_VERSION) \
-            --add-include-path=$(srcdir) --add-include-path=. \
-            --library=babl-$(BABL_API_VERSION) \
-            --libtool="$(LIBTOOL)" \
-            --output $@ \
-            -DBABL_IS_BEING_COMPILED \
-           -I$(top_srcdir) \
-           -I$(top_builddir) \
-           $(addprefix $(srcdir)/, $(libinc_hdrs)) \
-           $(addprefix $(builddir)/, $(libinc_generated_hdrs)) \
-           $(addprefix $(srcdir)/, $(c_sources))
-
-girdir = $(datadir)/gir-1.0
-gir_DATA = Babl-$(BABL_API_VERSION).gir
-
-typelibsdir = $(libdir)/girepository-1.0
-typelibs_DATA = Babl-$(BABL_API_VERSION).typelib
-
-%.typelib: %.gir
-       LD_LIBRARY_PATH=$${LD_LIBRARY_PATH:+$$LD_LIBRARY_PATH:}. $(INTROSPECTION_COMPILER) \
-        --includedir=$(srcdir) \
-        --includedir=$(top_builddir)/babl \
-        $(G_IR_COMPILER_OPTS) \
-        $< -o $@
-
-if HAVE_VALA
-babl-$(BABL_API_VERSION).vapi: Babl-$(BABL_API_VERSION).gir
-       $(VAPIGEN) --library=babl-$(BABL_API_VERSION) Babl-$(BABL_API_VERSION).gir
-
-vapidir=$(datadir)/vala/vapi
-vapi_DATA = babl-$(BABL_API_VERSION).vapi
-
-endif # HAVE_VALA
-
-endif # HAVE_INTROSPECTION
-
-EXTRA_DIST = $(gir_DATA)
-CLEANFILES = $(gir_DATA) $(typelibs_DATA) $(vapi_DATA)
+EXTRA_DIST = babl-ref-pixels.inc
+# CLEANFILES =
index 2b890520a3d5d3e84168aa076e90e1a076034f57..702685d716fdf72b6a5e9d6165aff92e44a8ae53 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 @SET_MAKE@
 
 
-
 VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -36,16 +52,16 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
+target_triplet = @target@
 subdir = babl
 DIST_COMMON = $(library_include_HEADERS) $(srcdir)/Makefile.am \
        $(srcdir)/Makefile.in $(srcdir)/babl-version.h.in \
        gettimeofday.c
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/introspection.m4 \
-       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
-       $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -79,8 +95,7 @@ am__uninstall_files_from_dir = { \
     || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
          $(am__cd) "$$dir" && rm -f $$files; }; \
   }
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
-       "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(vapidir)" \
+am__installdirs = "$(DESTDIR)$(libdir)" \
        "$(DESTDIR)$(library_includedir)"
 LTLIBRARIES = $(lib_LTLIBRARIES)
 libbabl_@BABL_API_VERSION@_la_DEPENDENCIES = base/libbase.la \
@@ -92,8 +107,8 @@ am__objects_2 = babl.lo babl-component.lo babl-conversion.lo \
        babl-fish.lo babl-format.lo babl-hash-table.lo babl-image.lo \
        babl-internal.lo babl-introspect.lo babl-list.lo \
        babl-memory.lo babl-model.lo babl-mutex.lo babl-palette.lo \
-       babl-sampling.lo babl-sanity.lo babl-type.lo babl-util.lo \
-       babl-cpuaccel.lo babl-version.lo
+       babl-ref-pixels.lo babl-sampling.lo babl-sanity.lo \
+       babl-type.lo babl-util.lo babl-cpuaccel.lo babl-version.lo
 am_libbabl_@BABL_API_VERSION@_la_OBJECTS = $(am__objects_1) \
        $(am__objects_2)
 libbabl_@BABL_API_VERSION@_la_OBJECTS =  \
@@ -140,7 +155,11 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
        install-pdf-recursive install-ps-recursive install-recursive \
        installcheck-recursive installdirs-recursive pdf-recursive \
        ps-recursive uninstall-recursive
-DATA = $(gir_DATA) $(typelibs_DATA) $(vapi_DATA)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 HEADERS = $(library_include_HEADERS)
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
   distclean-recursive maintainer-clean-recursive
@@ -222,14 +241,6 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
-INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
-INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
-INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
-INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
-INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
-INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
-INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -259,18 +270,15 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEP = @PATH_SEP@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
 RANLIB = @RANLIB@
 RSVG = @RSVG@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SHREXT = @SHREXT@
+SSE2_EXTRA_CFLAGS = @SSE2_EXTRA_CFLAGS@
 SSE_EXTRA_CFLAGS = @SSE_EXTRA_CFLAGS@
 STRIP = @STRIP@
-VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 W3M = @W3M@
 WEBSITE_HOST = @WEBSITE_HOST@
@@ -323,7 +331,11 @@ sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sysconfdir = @sysconfdir@
+target = @target@
 target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
@@ -351,6 +363,7 @@ c_sources = \
        babl-model.c                    \
        babl-mutex.c                    \
        babl-palette.c    \
+       babl-ref-pixels.c               \
        babl-sampling.c                 \
        babl-sanity.c                   \
        babl-type.c                     \
@@ -379,6 +392,7 @@ h_sources = \
        babl-memory.h                   \
        babl-model.h                    \
        babl-mutex.h                    \
+       babl-ref-pixels.h               \
        babl-sampling.h                 \
        babl-type.h                     \
        babl-types.h                    \
@@ -386,6 +400,7 @@ h_sources = \
 
 library_includedir = $(includedir)/babl-$(BABL_API_VERSION)/babl
 libinc_hdrs = \
+       babl-introspect.h       \
        babl-macros.h           \
        babl-types.h            \
        babl.h
@@ -411,17 +426,7 @@ libbabl_@BABL_API_VERSION@_la_LDFLAGS = \
        ${no_undefined} $(MATH_LIB)     \
        -version-info $(BABL_LIBRARY_VERSION)
 
-INTROSPECTION_GIRS = 
-INTROSPECTION_SCANNER_ARGS = --add-include-path=$(srcdir)
-INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
-@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
-@HAVE_INTROSPECTION_TRUE@gir_DATA = Babl-$(BABL_API_VERSION).gir
-@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0
-@HAVE_INTROSPECTION_TRUE@typelibs_DATA = Babl-$(BABL_API_VERSION).typelib
-@HAVE_INTROSPECTION_TRUE@@HAVE_VALA_TRUE@vapidir = $(datadir)/vala/vapi
-@HAVE_INTROSPECTION_TRUE@@HAVE_VALA_TRUE@vapi_DATA = babl-$(BABL_API_VERSION).vapi
-EXTRA_DIST = $(gir_DATA)
-CLEANFILES = $(gir_DATA) $(typelibs_DATA) $(vapi_DATA)
+EXTRA_DIST = babl-ref-pixels.inc
 all: all-recursive
 
 .SUFFIXES:
@@ -460,7 +465,6 @@ babl-version.h: $(top_builddir)/config.status $(srcdir)/babl-version.h.in
        cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 install-libLTLIBRARIES: $(lib_LTLIBRARIES)
        @$(NORMAL_INSTALL)
-       test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
        @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
        list2=; for p in $$list; do \
          if test -f $$p; then \
@@ -468,6 +472,8 @@ install-libLTLIBRARIES: $(lib_LTLIBRARIES)
          else :; fi; \
        done; \
        test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
          echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
          $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
        }
@@ -520,6 +526,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/babl-model.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/babl-mutex.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/babl-palette.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/babl-ref-pixels.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/babl-sampling.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/babl-sanity.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/babl-type.Plo@am__quote@
@@ -553,64 +560,13 @@ mostlyclean-libtool:
 
 clean-libtool:
        -rm -rf .libs _libs
-install-girDATA: $(gir_DATA)
-       @$(NORMAL_INSTALL)
-       test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)"
-       @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
-       for p in $$list; do \
-         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-         echo "$$d$$p"; \
-       done | $(am__base_list) | \
-       while read files; do \
-         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(girdir)'"; \
-         $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \
-       done
-
-uninstall-girDATA:
-       @$(NORMAL_UNINSTALL)
-       @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
-       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-       dir='$(DESTDIR)$(girdir)'; $(am__uninstall_files_from_dir)
-install-typelibsDATA: $(typelibs_DATA)
-       @$(NORMAL_INSTALL)
-       test -z "$(typelibsdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibsdir)"
-       @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
-       for p in $$list; do \
-         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-         echo "$$d$$p"; \
-       done | $(am__base_list) | \
-       while read files; do \
-         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(typelibsdir)'"; \
-         $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \
-       done
-
-uninstall-typelibsDATA:
-       @$(NORMAL_UNINSTALL)
-       @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
-       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-       dir='$(DESTDIR)$(typelibsdir)'; $(am__uninstall_files_from_dir)
-install-vapiDATA: $(vapi_DATA)
-       @$(NORMAL_INSTALL)
-       test -z "$(vapidir)" || $(MKDIR_P) "$(DESTDIR)$(vapidir)"
-       @list='$(vapi_DATA)'; test -n "$(vapidir)" || list=; \
-       for p in $$list; do \
-         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-         echo "$$d$$p"; \
-       done | $(am__base_list) | \
-       while read files; do \
-         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(vapidir)'"; \
-         $(INSTALL_DATA) $$files "$(DESTDIR)$(vapidir)" || exit $$?; \
-       done
-
-uninstall-vapiDATA:
-       @$(NORMAL_UNINSTALL)
-       @list='$(vapi_DATA)'; test -n "$(vapidir)" || list=; \
-       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-       dir='$(DESTDIR)$(vapidir)'; $(am__uninstall_files_from_dir)
 install-library_includeHEADERS: $(library_include_HEADERS)
        @$(NORMAL_INSTALL)
-       test -z "$(library_includedir)" || $(MKDIR_P) "$(DESTDIR)$(library_includedir)"
        @list='$(library_include_HEADERS)'; test -n "$(library_includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(library_includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(library_includedir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -793,13 +749,10 @@ distdir: $(DISTFILES)
        done
        @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
          if test "$$subdir" = .; then :; else \
-           test -d "$(distdir)/$$subdir" \
-           || $(MKDIR_P) "$(distdir)/$$subdir" \
-           || exit 1; \
-         fi; \
-       done
-       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
            dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
            $(am__relativize); \
            new_distdir=$$reldir; \
@@ -821,10 +774,10 @@ distdir: $(DISTFILES)
        done
 check-am: all-am
 check: check-recursive
-all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS)
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
 installdirs: installdirs-recursive
 installdirs-am:
-       for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(vapidir)" "$(DESTDIR)$(library_includedir)"; do \
+       for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(library_includedir)"; do \
          test -z "$$dir" || $(MKDIR_P) "$$dir"; \
        done
 install: install-recursive
@@ -849,7 +802,6 @@ install-strip:
 mostlyclean-generic:
 
 clean-generic:
-       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
 
 distclean-generic:
        -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
@@ -881,8 +833,7 @@ info: info-recursive
 
 info-am:
 
-install-data-am: install-girDATA install-library_includeHEADERS \
-       install-typelibsDATA install-vapiDATA
+install-data-am: install-library_includeHEADERS
 
 install-dvi: install-dvi-recursive
 
@@ -928,9 +879,8 @@ ps: ps-recursive
 
 ps-am:
 
-uninstall-am: uninstall-girDATA uninstall-libLTLIBRARIES \
-       uninstall-library_includeHEADERS uninstall-typelibsDATA \
-       uninstall-vapiDATA
+uninstall-am: uninstall-libLTLIBRARIES \
+       uninstall-library_includeHEADERS
 
 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
        install-am install-strip tags-recursive
@@ -942,44 +892,17 @@ uninstall-am: uninstall-girDATA uninstall-libLTLIBRARIES \
        distclean-libtool distclean-tags distdir dvi dvi-am html \
        html-am info info-am install install-am install-data \
        install-data-am install-dvi install-dvi-am install-exec \
-       install-exec-am install-girDATA install-html install-html-am \
-       install-info install-info-am install-libLTLIBRARIES \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-libLTLIBRARIES \
        install-library_includeHEADERS install-man install-pdf \
        install-pdf-am install-ps install-ps-am install-strip \
-       install-typelibsDATA install-vapiDATA installcheck \
-       installcheck-am installdirs installdirs-am maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags tags-recursive uninstall uninstall-am uninstall-girDATA \
-       uninstall-libLTLIBRARIES uninstall-library_includeHEADERS \
-       uninstall-typelibsDATA uninstall-vapiDATA
-
-
-# GObject Introspection
--include $(INTROSPECTION_MAKEFILE)
-
-@HAVE_INTROSPECTION_TRUE@Babl-$(BABL_API_VERSION).gir: $(G_IR_SCANNER) $(library_include_HEADERS) $(c_sources) $(srcdir)/Makefile.am
-@HAVE_INTROSPECTION_TRUE@      $(INTROSPECTION_SCANNER) -v --namespace Babl --nsversion=$(BABL_API_VERSION) \
-@HAVE_INTROSPECTION_TRUE@            --add-include-path=$(srcdir) --add-include-path=. \
-@HAVE_INTROSPECTION_TRUE@            --library=babl-$(BABL_API_VERSION) \
-@HAVE_INTROSPECTION_TRUE@            --libtool="$(LIBTOOL)" \
-@HAVE_INTROSPECTION_TRUE@            --output $@ \
-@HAVE_INTROSPECTION_TRUE@            -DBABL_IS_BEING_COMPILED \
-@HAVE_INTROSPECTION_TRUE@          -I$(top_srcdir) \
-@HAVE_INTROSPECTION_TRUE@          -I$(top_builddir) \
-@HAVE_INTROSPECTION_TRUE@          $(addprefix $(srcdir)/, $(libinc_hdrs)) \
-@HAVE_INTROSPECTION_TRUE@          $(addprefix $(builddir)/, $(libinc_generated_hdrs)) \
-@HAVE_INTROSPECTION_TRUE@          $(addprefix $(srcdir)/, $(c_sources))
-
-@HAVE_INTROSPECTION_TRUE@%.typelib: %.gir
-@HAVE_INTROSPECTION_TRUE@      LD_LIBRARY_PATH=$${LD_LIBRARY_PATH:+$$LD_LIBRARY_PATH:}. $(INTROSPECTION_COMPILER) \
-@HAVE_INTROSPECTION_TRUE@        --includedir=$(srcdir) \
-@HAVE_INTROSPECTION_TRUE@        --includedir=$(top_builddir)/babl \
-@HAVE_INTROSPECTION_TRUE@        $(G_IR_COMPILER_OPTS) \
-@HAVE_INTROSPECTION_TRUE@        $< -o $@
-
-@HAVE_INTROSPECTION_TRUE@@HAVE_VALA_TRUE@babl-$(BABL_API_VERSION).vapi: Babl-$(BABL_API_VERSION).gir
-@HAVE_INTROSPECTION_TRUE@@HAVE_VALA_TRUE@      $(VAPIGEN) --library=babl-$(BABL_API_VERSION) Babl-$(BABL_API_VERSION).gir
+       installcheck installcheck-am installdirs installdirs-am \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+       pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
+       uninstall-libLTLIBRARIES uninstall-library_includeHEADERS
+
+# CLEANFILES =
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
index 4f68aaa2f450745fb94d74d1d966c91937a6b0e4..37453e037780f4ce8a13bbdb6246d54af36e23a4 100644 (file)
@@ -24,6 +24,7 @@
 #define NEEDS_BABL_DB
 #include "babl-internal.h"
 #include "babl-db.h"
+#include "babl-ref-pixels.h"
 
 static Babl *
 conversion_new (const char    *name,
@@ -429,28 +430,6 @@ babl_conversion_process (const Babl *babl,
   return n;
 }
 
-#define test_pixels    128
-
-
-static double *
-test_create (void)
-{
-  static double test[sizeof (double) * test_pixels * 4];
-  int           i;
-  static int done = 0;
-
-  if (done)
-    return test;
-
-  srandom (20050728);
-
-  for (i = 0; i < test_pixels * 4; i++)
-    test [i] = (double) random () / RAND_MAX;
-
-  done = 1;
-  return test;
-}
-
 long
 babl_conversion_cost (BablConversion *conversion)
 {
@@ -479,7 +458,9 @@ babl_conversion_error (BablConversion *conversion)
   long    ticks_start = 0;
   long    ticks_end   = 0;
 
-  double *test;
+  const int test_pixels = babl_get_num_conversion_test_pixels ();
+  const double *test = babl_get_conversion_test_pixels ();
+
   void   *source;
   void   *destination;
   double *destination_rgba_double;
@@ -521,9 +502,6 @@ babl_conversion_error (BablConversion *conversion)
       conversion->error = 0.000042;
     }
 
-  test = test_create ();
-
-
   source                      = babl_calloc (test_pixels, fmt_source->format.bytes_per_pixel);
   destination                 = babl_calloc (test_pixels, fmt_destination->format.bytes_per_pixel);
   ref_destination             = babl_calloc (test_pixels, fmt_destination->format.bytes_per_pixel);
index ee12fd6d03555d3b525a55892aba98b4dad9d39c..3445cf6c628a0d7957aeb2842089a5a91cba2510 100644 (file)
@@ -490,6 +490,10 @@ cpu_accel (void)
 
   accel = arch_accel ();
 
+#if defined(ARCH_X86_64)
+  accel |= BABL_CPU_ACCEL_X86_64;
+#endif
+
   return (BablCpuAccelFlags) accel;
 
 #else /* !HAVE_ACCEL */
index c95af9135b6854fa2cafaffd48584de529239d58..e701e2afdd14525ae5369e463a0dea7ca5beca55 100644 (file)
@@ -32,7 +32,8 @@ typedef enum
   BABL_CPU_ACCEL_X86_SSE3    = 0x02000000,
 
   /* powerpc accelerations */
-  BABL_CPU_ACCEL_PPC_ALTIVEC = 0x04000000
+  BABL_CPU_ACCEL_PPC_ALTIVEC = 0x04000000,
+  BABL_CPU_ACCEL_X86_64      = 0x00100000
 } BablCpuAccelFlags;
 
 
index d0219148a844e9cd37dba3558065c72435d1a926..7626867f4c15119f7726fb2f9b9cb737b3986cd5 100644 (file)
@@ -332,8 +332,10 @@ babl_extension_load_dir_list (const char *dir_list)
           case BABL_PATH_SEPARATOR:
           {
             char *expanded_path = expand_path (path);
-            babl_extension_load_dir (expanded_path);
-            babl_free (expanded_path);
+            if (expanded_path) {
+                babl_extension_load_dir (expanded_path);
+                babl_free (expanded_path);
+            }
           }
             dst = path;
             src++;
index 7914e0c84162a9e8466d20161c2be1803ceadc76..5dc06017f5b4b95ab4b0d0dfe3ac39bb9a9c6aeb 100644 (file)
 #include "config.h"
 #include <math.h>
 #include "babl-internal.h"
+#include "babl-ref-pixels.h"
 
 #define BABL_LEGAL_ERROR           0.000001
 #define BABL_MAX_COST_VALUE        2000000
 #define BABL_HARD_MAX_PATH_LENGTH  8
 #define BABL_MAX_NAME_LEN          1024
 
+#ifndef MIN
+#define MIN(a, b) (((a) > (b)) ? (b) : (a))
+#endif
+
+#define NUM_TEST_PIXELS            (babl_get_num_path_test_pixels ())
+#define MAX_BUFFER_SIZE            1024  /* XXX: reasonable size for this should be profiled */
+
+
 int   babl_in_fish_path = 0;
 
 typedef struct _FishPathInstrumentation
 {
   const Babl   *fmt_rgba_double;
-  double *test;
+  int     num_test_pixels;
   void   *source;
   void   *destination;
   void   *ref_destination;
@@ -64,10 +73,13 @@ get_path_instrumentation (FishPathInstrumentation *fpi,
                           double                  *ref_cost,
                           double                  *path_error);
 
+
 static long
 process_conversion_path (BablList   *path,
                          const void *source_buffer,
+                         int         source_bpp,
                          void       *destination_buffer,
+                         int         dest_bpp,
                          long        n);
 
 static void
@@ -76,9 +88,6 @@ get_conversion_path (PathContext *pc,
                      int current_length,
                      int max_length);
 
-static double *
-test_create (void);
-
 static char *
 create_name (char       *buf,
              const Babl *source,
@@ -100,7 +109,7 @@ static double legal_error (void)
 
   env = getenv ("BABL_TOLERANCE");
   if (env && env[0] != '\0')
-    error = atof (env);
+    error = babl_parse_double (env);
   else
     error = BABL_LEGAL_ERROR;
   return error;
@@ -173,6 +182,10 @@ get_conversion_path (PathContext *pc,
         {
           FishPathInstrumentation fpi;
           memset (&fpi, 0, sizeof (fpi));
+
+          fpi.source = (Babl*) babl_list_get_first (pc->current_path)->conversion.source;
+          fpi.destination = pc->to_format;
+
           get_path_instrumentation (&fpi, pc->current_path, &path_cost, &ref_cost, &path_error);
 
           if ((path_cost < ref_cost) && /* do not use paths that took longer to compute than reference */
@@ -323,9 +336,40 @@ babl_fish_path_process (Babl       *babl,
                         void       *destination,
                         long        n)
 {
+   const Babl *babl_source = babl->fish.source;
+   const Babl *babl_dest = babl->fish.destination;
+   int source_bpp = 0;
+   int dest_bpp = 0;
+
+   switch (babl_source->instance.class_type)
+     {
+       case BABL_FORMAT:
+         source_bpp = babl_source->format.bytes_per_pixel;
+         break;
+       case BABL_TYPE:
+         source_bpp = babl_source->type.bits / 8;
+         break;
+       default:
+         babl_log ("=eeek{%i}\n", babl_source->instance.class_type - BABL_MAGIC);
+     }
+
+   switch (babl_dest->instance.class_type)
+     {
+       case BABL_FORMAT:
+         dest_bpp = babl_dest->format.bytes_per_pixel;
+         break;
+       case BABL_TYPE:
+         dest_bpp = babl_dest->type.bits / 8;
+         break;
+       default:
+         babl_log ("-eeek{%i}\n", babl_dest->instance.class_type - BABL_MAGIC);
+     }
+
   return process_conversion_path (babl->fish_path.conversion_list,
                                   source,
+                                  source_bpp,
                                   destination,
+                                  dest_bpp,
                                   n);
 
 }
@@ -392,13 +436,14 @@ babl_process (const Babl *cbabl,
     return 0;
   babl_assert (n > 0);
 
-  /* first check if it is a fish since that is out fast path */
+  /* first check if it is a fish since that is our fast path */
   if (babl->class_type >= BABL_FISH &&
       babl->class_type <= BABL_FISH_PATH)
     {
       babl->fish.processings++;
-      return babl->fish.pixels +=
+      babl->fish.pixels +=
              babl_fish_process (babl, source, destination, n);
+      return n;
     }
 
   /* matches all conversion classes */
@@ -410,10 +455,22 @@ babl_process (const Babl *cbabl,
   return -1;
 }
 
+#include <stdint.h>
+
+#define BABL_ALIGN 16
+static void inline *align_16 (unsigned char *ret)
+{
+  int offset = BABL_ALIGN - ((uintptr_t) ret) % BABL_ALIGN;
+  ret = ret + offset;
+  return ret;
+}
+
 static long
 process_conversion_path (BablList   *path,
                          const void *source_buffer,
+                         int         source_bpp,
                          void       *destination_buffer,
+                         int         dest_bpp,
                          long        n)
 {
   int conversions = babl_list_size (path);
@@ -427,86 +484,62 @@ process_conversion_path (BablList   *path,
     }
   else
     {
-      void *aux1_buffer = babl_malloc (n * sizeof (double) * 5);
-      void *aux2_buffer = NULL;
-      void *swap_buffer = NULL;
-      int   i;
+      long j;
+
+      void *temp_buffer = align_16 (alloca (MIN(n, MAX_BUFFER_SIZE) * sizeof (double) * 5 + 16));
+      void *temp_buffer2 = NULL;
 
       if (conversions > 2)
         {
           /* We'll need one more auxiliary buffer */
-          aux2_buffer = babl_malloc (n * sizeof (double) * 5);
+          temp_buffer2 = align_16 (alloca (MIN(n, MAX_BUFFER_SIZE) * sizeof (double) * 5 + 16));
         }
 
-      /* The first conversion goes from source_buffer to aux1_buffer */
-      babl_conversion_process (babl_list_get_first (path),
-                               source_buffer,
-                               aux1_buffer,
-                               n);
 
-      /* Process, if any, conversions between the first and the last
-       * conversion in the path, in a loop */
-      for (i = 1; i < conversions - 1; i++)
+
+
+      for (j = 0; j < n; j+= MAX_BUFFER_SIZE)
         {
-          babl_conversion_process (path->items[i],
+          long c = MIN (n - j, MAX_BUFFER_SIZE);
+          int i;
+
+          /* this is where the loop unrolling should happen */
+          void *aux1_buffer = temp_buffer;
+          void *aux2_buffer = NULL;
+          void *swap_buffer = NULL;
+          aux2_buffer = temp_buffer2;
+
+          /* The first conversion goes from source_buffer to aux1_buffer */
+          babl_conversion_process (babl_list_get_first (path),
+                                   (void*)(((unsigned char*)source_buffer) + (j * source_bpp)),
                                    aux1_buffer,
-                                   aux2_buffer,
-                                   n);
-          /* Swap the auxiliary buffers */
-          swap_buffer = aux1_buffer;
-          aux1_buffer = aux2_buffer;
-          aux2_buffer = swap_buffer;
-        }
+                                   c);
 
-      /* The last conversion goes from aux1_buffer to destination_buffer */
-      babl_conversion_process (babl_list_get_last (path),
-                               aux1_buffer,
-                               destination_buffer,
-                               n);
+          /* Process, if any, conversions between the first and the last
+           * conversion in the path, in a loop */
+          for (i = 1; i < conversions - 1; i++)
+            {
+              babl_conversion_process (path->items[i],
+                                       aux1_buffer,
+                                       aux2_buffer,
+                                       c);
+              /* Swap the auxiliary buffers */
+              swap_buffer = aux1_buffer;
+              aux1_buffer = aux2_buffer;
+              aux2_buffer = swap_buffer;
+            }
 
-      /* Free auxiliary buffers */
-      if (aux1_buffer)
-        babl_free (aux1_buffer);
-      if (aux2_buffer)
-        babl_free (aux2_buffer);
+          /* The last conversion goes from aux1_buffer to destination_buffer */
+          babl_conversion_process (babl_list_get_last (path),
+                                   aux1_buffer,
+                                   (void*)((unsigned char*)destination_buffer + (j * dest_bpp)),
+                                   c);
+        }
   }
 
   return n;
 }
 
-#define NUM_TEST_PIXELS  (256 + 16 + 16)
-
-static double *
-test_create (void)
-{
-  static double test[sizeof (double) * NUM_TEST_PIXELS * 4];
-  int           i, j;
-  static int    done = 0;
-
-  if (done)
-    return test;
-
-  /* There is no need to generate the test
-   * more times ... */
-
-  srandom (20050728);
-
-  /*  add 128 pixels in the valid range between 0.0 and 1.0  */
-  for (i = 0; i < 256 * 4; i++)
-    test [i] = (double) random () / RAND_MAX;
-
-  /*  add 16 pixels between -1.0 and 0.0  */
-  for (j = 0; j < 16 * 4; i++, j++)
-    test [i] = 0.0 - (double) random () / RAND_MAX;
-
-  /*  add 16 pixels between 1.0 and 2.0  */
-  for (j = 0; j < 16 * 4; i++, j++)
-    test [i] = 1.0 + (double) random () / RAND_MAX;
-
-  done = 1;
-  return test;
-}
-
 static void
 init_path_instrumentation (FishPathInstrumentation *fpi,
                            Babl                    *fmt_source,
@@ -515,6 +548,8 @@ init_path_instrumentation (FishPathInstrumentation *fpi,
   long   ticks_start = 0;
   long   ticks_end   = 0;
 
+  const double *test_pixels = babl_get_path_test_pixels ();
+
   if (!fpi->fmt_rgba_double)
     {
       fpi->fmt_rgba_double = babl_format_new (
@@ -527,8 +562,7 @@ init_path_instrumentation (FishPathInstrumentation *fpi,
         NULL);
     }
 
-  if (!fpi->test)
-    fpi->test = test_create (); // <- test_create utiliza var static dentro de la función
+  fpi->num_test_pixels = babl_get_num_path_test_pixels ();
 
   fpi->fish_rgba_to_source      = babl_fish_reference (fpi->fmt_rgba_double,
                                                   fmt_source);
@@ -537,31 +571,31 @@ init_path_instrumentation (FishPathInstrumentation *fpi,
   fpi->fish_destination_to_rgba = babl_fish_reference (fmt_destination,
                                                   fpi->fmt_rgba_double);
 
-  fpi->source                      = babl_calloc (NUM_TEST_PIXELS,
+  fpi->source                      = babl_calloc (fpi->num_test_pixels,
                                              fmt_source->format.bytes_per_pixel);
-  fpi->destination                 = babl_calloc (NUM_TEST_PIXELS,
+  fpi->destination                 = babl_calloc (fpi->num_test_pixels,
                                              fmt_destination->format.bytes_per_pixel);
-  fpi->ref_destination             = babl_calloc (NUM_TEST_PIXELS,
+  fpi->ref_destination             = babl_calloc (fpi->num_test_pixels,
                                              fmt_destination->format.bytes_per_pixel);
-  fpi->destination_rgba_double     = babl_calloc (NUM_TEST_PIXELS,
+  fpi->destination_rgba_double     = babl_calloc (fpi->num_test_pixels,
                                              fpi->fmt_rgba_double->format.bytes_per_pixel);
-  fpi->ref_destination_rgba_double = babl_calloc (NUM_TEST_PIXELS,
+  fpi->ref_destination_rgba_double = babl_calloc (fpi->num_test_pixels,
                                              fpi->fmt_rgba_double->format.bytes_per_pixel);
 
   /* create sourcebuffer from testbuffer in the correct format */
   babl_process (fpi->fish_rgba_to_source,
-                fpi->test, fpi->source, NUM_TEST_PIXELS);
+                test_pixels, fpi->source, fpi->num_test_pixels);
 
   /* calculate the reference buffer of how it should be */
   ticks_start = babl_ticks ();
   babl_process (fpi->fish_reference,
-                fpi->source, fpi->ref_destination, NUM_TEST_PIXELS);
+                fpi->source, fpi->ref_destination, fpi->num_test_pixels);
   ticks_end = babl_ticks ();
   fpi->reference_cost = babl_process_cost (ticks_start, ticks_end);
 
   /* transform the reference destination buffer to RGBA */
   babl_process (fpi->fish_destination_to_rgba,
-                fpi->ref_destination, fpi->ref_destination_rgba_double, NUM_TEST_PIXELS);
+                fpi->ref_destination, fpi->ref_destination_rgba_double, fpi->num_test_pixels);
 }
 
 static void
@@ -590,20 +624,48 @@ get_path_instrumentation (FishPathInstrumentation *fpi,
   long   ticks_start = 0;
   long   ticks_end   = 0;
 
+  Babl *babl_source = fpi->source;
+  Babl *babl_destination = fpi->destination;
+
+  int source_bpp = 0;
+  int dest_bpp = 0;
+
+  switch (babl_source->instance.class_type)
+    {
+      case BABL_FORMAT:
+        source_bpp = babl_source->format.bytes_per_pixel;
+        break;
+      case BABL_TYPE:
+        source_bpp = babl_source->type.bits / 8;
+        break;
+      default:
+        babl_log ("=eeek{%i}\n", babl_source->instance.class_type - BABL_MAGIC);
+    }
+
+  switch (babl_destination->instance.class_type)
+    {
+      case BABL_FORMAT:
+        dest_bpp = babl_destination->format.bytes_per_pixel;
+        break;
+      case BABL_TYPE:
+        dest_bpp = babl_destination->type.bits / 8;
+        break;
+      default:
+        babl_log ("-eeek{%i}\n", babl_destination->instance.class_type - BABL_MAGIC);
+     }
+
   if (!fpi->init_instrumentation_done)
     {
       /* this initialization can be done only once since the
        * source and destination formats do not change during
        * the search */
-      Babl *fmt_source = (Babl *) BABL (babl_list_get_first (path))->conversion.source;
-      Babl *fmt_destination = (Babl *) BABL (babl_list_get_last (path))->conversion.destination;
-      init_path_instrumentation (fpi, fmt_source, fmt_destination);
+      init_path_instrumentation (fpi, babl_source, babl_destination);
       fpi->init_instrumentation_done = 1;
     }
 
   /* calculate this path's view of what the result should be */
   ticks_start = babl_ticks ();
-  process_conversion_path (path, fpi->source, fpi->destination, NUM_TEST_PIXELS);
+  process_conversion_path (path, fpi->source, source_bpp, fpi->destination, dest_bpp, fpi->num_test_pixels);
   ticks_end = babl_ticks ();
   *path_cost = babl_process_cost (ticks_start, ticks_end);
 
@@ -611,20 +673,20 @@ get_path_instrumentation (FishPathInstrumentation *fpi,
    * for comparison with each other
    */
   babl_process (fpi->fish_destination_to_rgba,
-                fpi->destination, fpi->destination_rgba_double, NUM_TEST_PIXELS);
+                fpi->destination, fpi->destination_rgba_double, fpi->num_test_pixels);
 
   *path_error = babl_rel_avg_error (fpi->destination_rgba_double,
                                     fpi->ref_destination_rgba_double,
-                                    NUM_TEST_PIXELS * 4);
+                                    fpi->num_test_pixels * 4);
 
 #if 0
   fpi->fish_rgba_to_source->fish.processings--;
   fpi->fish_reference->fish.processings--;
   fpi->fish_destination_to_rgba->fish.processings -= 2;
 
-  fpi->fish_rgba_to_source->fish.pixels      -= NUM_TEST_PIXELS;
-  fpi->fish_reference->fish.pixels           -= NUM_TEST_PIXELS;
-  fpi->fish_destination_to_rgba->fish.pixels -= 2 * NUM_TEST_PIXELS;
+  fpi->fish_rgba_to_source->fish.pixels      -= fpi->num_test_pixels;
+  fpi->fish_reference->fish.pixels           -= fpi->num_test_pixels;
+  fpi->fish_destination_to_rgba->fish.pixels -= 2 * fpi->num_test_pixels;
 #endif
 
   *ref_cost = fpi->reference_cost;
index b00d67d787eb9115ed1d57668d84cb9b97e4932d..4133e403fb64e8eb721e147480e4c7f941878362 100644 (file)
@@ -93,8 +93,7 @@ babl_fish_reference (const Babl *source,
 
 static void
 convert_to_double (BablFormat      *source_fmt,
-                   const BablImage *source,
-                   char            *source_buf,
+                   const char      *source_buf,
                    char            *source_double_buf,
                    int              n)
 {
@@ -114,7 +113,7 @@ convert_to_double (BablFormat      *source_fmt,
   dst_img->stride[0] = 0;
 
 
-  src_img->data[0]   = source_buf;
+  src_img->data[0]   = (char *)source_buf;
   src_img->type[0]   = (BablType *) babl_type_from_id (BABL_DOUBLE);
   src_img->pitch[0]  = source_fmt->bytes_per_pixel;
   src_img->stride[0] = 0;
@@ -133,14 +132,14 @@ convert_to_double (BablFormat      *source_fmt,
             {
               dst_img->data[0] =
                 source_double_buf + (dst_img->type[0]->bits / 8) * j;
+
+              babl_process (assert_conversion_find (src_img->type[0],
+                                                    dst_img->type[0]),
+                            src_img, dst_img, n);
               break;
             }
         }
 
-      babl_process (
-        assert_conversion_find (src_img->type[0], dst_img->type[0]),
-        src_img, dst_img,
-        n);
       src_img->data[0] += src_img->type[0]->bits / 8;
     }
   babl_free (src_img);
@@ -151,7 +150,6 @@ convert_to_double (BablFormat      *source_fmt,
 static void
 convert_from_double (BablFormat *destination_fmt,
                      char       *destination_double_buf,
-                     BablImage  *destination,
                      char       *destination_buf,
                      int         n)
 {
@@ -187,14 +185,14 @@ convert_from_double (BablFormat *destination_fmt,
             {
               src_img->data[0] =
                 destination_double_buf + (src_img->type[0]->bits / 8) * j;
+
+              babl_process (assert_conversion_find (src_img->type[0],
+                                                    dst_img->type[0]),
+                            src_img, dst_img, n);
               break;
             }
         }
 
-      babl_process (
-        assert_conversion_find (src_img->type[0], dst_img->type[0]),
-        src_img, dst_img,
-        n);
       dst_img->data[0] += dst_img->type[0]->bits / 8;
     }
   babl_free (src_img);
@@ -204,7 +202,6 @@ convert_from_double (BablFormat *destination_fmt,
 
 static void
 ncomponent_convert_to_double (BablFormat       *source_fmt,
-                              const BablImage  *source,
                               char             *source_buf,
                               char             *source_double_buf,
                               int               n)
@@ -221,7 +218,7 @@ ncomponent_convert_to_double (BablFormat       *source_fmt,
   dst_img->pitch[0] = (dst_img->type[0]->bits / 8);
   dst_img->stride[0] = 0;
 
-  src_img->data[0]   = source_buf;
+  src_img->data[0] = source_buf;
   src_img->type[0] = source_fmt->type[0];
   src_img->pitch[0] = source_fmt->type[0]->bits / 8;
   src_img->stride[0] = 0;
@@ -239,7 +236,6 @@ ncomponent_convert_to_double (BablFormat       *source_fmt,
 static void
 ncomponent_convert_from_double (BablFormat *destination_fmt,
                                 char       *destination_double_buf,
-                                BablImage  *destination,
                                 char       *destination_buf,
                                 int         n)
 {
@@ -274,38 +270,67 @@ ncomponent_convert_from_double (BablFormat *destination_fmt,
 }
 
 
-
 static int
-process_same_model (const Babl      *babl,
-                    const BablImage *source,
-                    BablImage       *destination,
-                    long             n)
+process_to_n_component (const Babl  *babl,
+                        const char *source,
+                        char       *destination,
+                        long        n)
 {
   void *double_buf;
+#ifndef MAX
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#endif
+  int components = MAX(BABL (babl->fish.source)->format.model->components,
+                       BABL (babl->fish.source)->format.components);
+  components = MAX(components, BABL (babl->fish.destination)->format.components);
+  components = MAX(components, BABL (babl->fish.destination)->model.components);
+
+  double_buf = babl_malloc (sizeof (double) * n * components);
+      memset (double_buf, 0,sizeof (double) * n * components);
 
-  if (BABL_IS_BABL (source) ||
-      BABL_IS_BABL (destination))
     {
-      babl_log ("args=(%p, %p, %p, %li): trying to handle BablImage (unconfirmed code)",
-                babl_fish, source, destination, n);
+      ncomponent_convert_to_double (
+        (BablFormat *) BABL (babl->fish.source),
+        (char *) source,
+        double_buf,
+        n
+      );
+
+      ncomponent_convert_from_double (
+        (BablFormat *) BABL (babl->fish.destination),
+        double_buf,
+        (char *) destination,
+        n
+      );
     }
 
+  babl_free (double_buf);
+  return 0;
+}
+
+
+static int
+process_same_model (const Babl  *babl,
+                    const char *source,
+                    char       *destination,
+                    long        n)
+{
+  void *double_buf;
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+
   double_buf = babl_malloc (sizeof (double) * n *
-                            BABL (babl->fish.source)->format.components);
+                            MAX (BABL (babl->fish.source)->format.model->components,
+                                 BABL (babl->fish.source)->format.components));
+#undef MAX
 
-  if (
-      (BABL (babl->fish.source)->format.components ==
+  if ((BABL (babl->fish.source)->format.components ==
        BABL (babl->fish.destination)->format.components)
       && (BABL (babl->fish.source)->format.model->components !=
           BABL (babl->fish.source)->format.components))
     {
-      /* FIXME: should recursively invoke babl and look up an appropriate fish
-       * for the conversion and multiply n by the number of components.
-       */
       ncomponent_convert_to_double (
         (BablFormat *) BABL (babl->fish.source),
-        BABL_IS_BABL (source) ? source : NULL,
-        BABL_IS_BABL (source) ? NULL : (char *) source,
+        (char *) source,
         double_buf,
         n
       );
@@ -313,8 +338,7 @@ process_same_model (const Babl      *babl,
       ncomponent_convert_from_double (
         (BablFormat *) BABL (babl->fish.destination),
         double_buf,
-        BABL_IS_BABL (destination) ? destination : NULL,
-        BABL_IS_BABL (destination) ? NULL : (char *) destination,
+        (char *) destination,
         n
       );
     }
@@ -322,8 +346,7 @@ process_same_model (const Babl      *babl,
     {
       convert_to_double (
         (BablFormat *) BABL (babl->fish.source),
-        BABL_IS_BABL (source) ? source : NULL,
-        BABL_IS_BABL (source) ? NULL : (char *) source,
+        (char *) source,
         double_buf,
         n
       );
@@ -331,8 +354,7 @@ process_same_model (const Babl      *babl,
       convert_from_double (
         (BablFormat *) BABL (babl->fish.destination),
         double_buf,
-        BABL_IS_BABL (destination) ? destination : NULL,
-        BABL_IS_BABL (destination) ? NULL : (char *) destination,
+        (char *) destination,
         n
       );
     }
@@ -341,10 +363,10 @@ process_same_model (const Babl      *babl,
 }
 
 long
-babl_fish_reference_process (const Babl      *babl,
-                             const BablImage *source,
-                             BablImage       *destination,
-                             long             n)
+babl_fish_reference_process (const Babl *babl,
+                             const char *source,
+                             char       *destination,
+                             long        n)
 {
   void *source_double_buf;
   void *rgba_double_buf;
@@ -357,14 +379,13 @@ babl_fish_reference_process (const Babl      *babl,
   if (BABL (babl->fish.source)->format.model ==
       BABL (babl->fish.destination)->format.model)
     return process_same_model (babl, source, destination, n);
-#if 0
-  if (BABL_IS_BABL (source) ||
-      BABL_IS_BABL (destination))
-    {
-      babl_log ("args=(%p, %p, %p, %li): trying to handle BablImage (unconfirmed code)",
-                babl_fish, source, destination, n);
-    }
-#endif
+
+  if (babl_format_is_format_n (BABL (babl->fish.destination)))
+  {
+    return process_to_n_component (babl, source, destination, n);
+  }
+  
+
 
   source_double_buf = babl_malloc (sizeof (double) * n *
                                    BABL (babl->fish.source)->format.model->components);
@@ -381,8 +402,7 @@ babl_fish_reference_process (const Babl      *babl,
 
   convert_to_double (
     (BablFormat *) BABL (babl->fish.source),
-    NULL,
-    (char *) source,
+    source,
     source_double_buf,
     n
   );
@@ -435,8 +455,7 @@ babl_fish_reference_process (const Babl      *babl,
   convert_from_double (
     (BablFormat *) BABL (babl->fish.destination),
     destination_double_buf,
-    NULL,
-    (char *) destination,
+    destination,
     n
   );
 
index ccd4037e1ad29b5218c6749237afc2d2484f78c0..c0b34de47333d728698cdc19f77acb360df2a5fb 100644 (file)
@@ -252,7 +252,7 @@ static double legal_error (void)
 
   env = getenv ("BABL_TOLERANCE");
   if (env && env[0] != '\0')
-    error = atof (env);
+    error = babl_parse_double (env);
   else
     error = BABL_LEGAL_ERROR;
   return error;
@@ -308,7 +308,7 @@ babl_fish_stats (FILE *file)
            "<html>\n"
            "<head>\n"
            "<title>BablFishPath introspection</title>\n"
-
+           "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n"
            "<style type='text/css'>"
            " body {"
            "   font-family: sans;"
index 7f43911f2f7be6d9e34d5b21f914f475bbf9a582..757ae58531e9c86f1bb572d923a28e1a8101a4ec 100644 (file)
@@ -24,6 +24,7 @@
 #define NEEDS_BABL_DB
 #include "babl-internal.h"
 #include "babl-db.h"
+#include "babl-ref-pixels.h"
 
 static int babl_format_destruct (void *babl)
 {
@@ -115,6 +116,7 @@ format_new (const char     *name,
   babl->format.visited = 0;
   babl->format.image_template = NULL;
   babl->format.format_n = 0;
+  babl->format.palette = 0;
 
   return babl;
 }
@@ -542,29 +544,10 @@ babl_format_with_model_as_type (const Babl *model,
   );
 }
 
-#define test_pixels    256
-
-static double *
-test_create (void)
-{
-  double *test;
-  int     i;
-
-  srandom (20050728);
-
-  test = babl_malloc (sizeof (double) * test_pixels * 4);
-
-  for (i = 0; i < test_pixels * 4; i++)
-    test [i] = (double) random () / RAND_MAX;
-
-  return test;
-}
-
 double
 babl_format_loss (const Babl *babl)
 {
   double  loss = 0.0;
-  double *test;
   void   *original;
   double *clipped;
   void   *destination;
@@ -575,6 +558,9 @@ babl_format_loss (const Babl *babl)
   Babl       *fish_to;
   Babl       *fish_from;
 
+  const double *test = babl_get_format_test_pixels ();
+  const int     test_pixels = babl_get_num_format_test_pixels ();
+
   ref_fmt = babl_format_new (
     babl_model ("RGBA"),
     babl_type ("double"),
@@ -591,7 +577,6 @@ babl_format_loss (const Babl *babl)
   fish_to   = babl_fish_reference (ref_fmt, fmt);
   fish_from = babl_fish_reference (fmt, ref_fmt);
 
-  test        = test_create ();
   original    = babl_calloc (test_pixels, fmt->format.bytes_per_pixel);
   clipped     = babl_calloc (test_pixels, ref_fmt->format.bytes_per_pixel);
   destination = babl_calloc (test_pixels, fmt->format.bytes_per_pixel);
@@ -613,7 +598,6 @@ babl_format_loss (const Babl *babl)
   babl_free (clipped);
   babl_free (destination);
   babl_free (transformed);
-  babl_free (test);
 
   ((Babl*)babl)->format.loss = loss;
   return loss;
@@ -653,4 +637,16 @@ babl_set_user_data (const Babl *cbabl, void *data)
     }
 }
 
+const Babl *
+babl_format_get_model (const Babl *format)
+{
+  if (format->class_type == BABL_FORMAT)
+    {
+      return (Babl*)format->format.model;
+    }
+  return NULL;
+}
+
 BABL_CLASS_IMPLEMENT (format)
+
+
index f0f6c6198cbb1ad5b6972989d1e269b37bb7e4b3..a42d09b03b6beb1e7be8aa940a0cde60f8506df2 100644 (file)
@@ -25,6 +25,7 @@ enum {
   BABL_U8,
   BABL_U16,
   BABL_U32,
+  BABL_HALF,
   BABL_FLOAT,
   BABL_DOUBLE,
   BABL_HALF_FLOAT,
@@ -90,6 +91,8 @@ enum {
   BABL_FORMAT_BASE = 100000,
   BABL_SRGB,
   BABL_SRGBA,
+  BABL_RGB_HALF,
+  BABL_RGBA_HALF,
   BABL_RGB_FLOAT,
   BABL_RGBA_FLOAT,
   BABL_RGBA_DOUBLE,
@@ -99,8 +102,10 @@ enum {
   BABL_RGB_U8,
   BABL_RGBA_U8,
   BABL_RGBA_U16,
+  BABL_CMYK_HALF,
   BABL_CMYK_FLOAT,
   BABL_CMYK_ALPHA_FLOAT,
+  BABL_CMYK_ALPHA_HALF,
   BABL_YCBCR411,
   BABL_YCBCR422,
   BABL_YCBCR420,
index 6f821cdf2c854f9f2aa4d653161e1642a77a9e1e..eb80dd02652987746c9c2c05d4043166361df9dc 100644 (file)
 #include "babl-mutex.h"
 #include "babl-cpuaccel.h"
 
-/* redefining some functions for the win32 platform */
-#ifdef _WIN32
-#define srandom srand
-#define random  rand
-#endif
-
 /* fallback to floor function when rint is not around */
 #ifndef HAVE_RINT
 # define rint(f)  (floor (((double) (f)) + 0.5))
@@ -82,10 +76,10 @@ void     babl_set_extender              (Babl           *new_extender);
 Babl   * babl_extension_quiet_log       (void);
 void     babl_extension_deinit          (void);
 
-long     babl_fish_reference_process    (const Babl     *babl,
-                                         const BablImage*source,
-                                         BablImage      *destination,
-                                         long            n);
+long     babl_fish_reference_process    (const Babl *babl,
+                                         const char *source,
+                                         char       *destination,
+                                         long        n);
 
 Babl   * babl_fish_reference            (const Babl     *source,
                                          const Babl     *destination);
@@ -118,14 +112,13 @@ int      babl_type_is_symmetric         (const Babl     *babl);
 int babl_backtrack (void);
 
 static inline void
-real_babl_log (const char *file,
-               int         line,
-               const char *function,
-               const char *fmt, ...)
+real_babl_log_va(const char *file,
+                 int         line,
+                 const char *function,
+                 const char *fmt,
+                 va_list     varg)
 {
   Babl *extender = babl_extender();
-  va_list  varg;
-
 
   if (extender != babl_extension_quiet_log())
     {
@@ -135,15 +128,26 @@ real_babl_log (const char *file,
       fprintf (stdout, "%s:%i %s()\n\t", file, line, function);
     }
 
-  va_start (varg, fmt);
   vfprintf (stdout, fmt, varg);
-  va_end (varg);
 
   fprintf (stdout, "\n");
   fflush (NULL);
   return;
 }
 
+static inline void
+real_babl_log (const char *file,
+               int         line,
+               const char *function,
+               const char *fmt, ...)
+{
+  va_list  varg;
+
+  va_start (varg, fmt);
+  real_babl_log_va(file, line, function, fmt, varg);
+  va_end (varg);
+}
+
 /* Provide a string identifying the current function, non-concatenatable */
 #ifndef G_STRFUNC
 #if defined (__GNUC__)
@@ -186,7 +190,7 @@ babl_log (const char *format, ...)
 {
   va_list args;
   va_start (args, format);
-  real_babl_log (__FILE__, __LINE__, G_STRFUNC, format, args);
+  real_babl_log_va (__FILE__, __LINE__, G_STRFUNC, format, args);
   va_end (args);
 }
 static inline void
@@ -194,7 +198,7 @@ babl_fatal (const char *format, ...)
 {
   va_list args;
   va_start (args, format);
-  real_babl_log (__FILE__, __LINE__, G_STRFUNC, format, args);
+  real_babl_log_va (__FILE__, __LINE__, G_STRFUNC, format, args);
   va_end (args);
   babl_die();
 }
@@ -291,4 +295,26 @@ babl_##klass##_from_id (int id)                               \
 
 #define BABL(obj)  ((Babl*)(obj))
 
+static inline double babl_parse_double (const char *str)
+{
+  double result = 0;
+  if (!str)
+    return 0.0;
+  result = atoi (str);
+  if (strchr (str, '.'))
+  {
+    char *p = strchr (str, '.') + 1;
+    double d = 10;
+    for (;*p && *p > '0' && *p < '9';p++, d *= 10)
+    {
+      if (result >= 0)
+        result += (*p - '0') / d;
+      else
+        result -= (*p - '0') / d;
+    }
+  }
+  return result;
+}
+
+
 #endif
index 34cf9b43348ed372e76f22fa07818c38a48ffb16..d9691926c7c32ce885dc2733cf1e77fc86a8aaf6 100644 (file)
@@ -164,6 +164,15 @@ fish_introspect (Babl *babl)
             babl->fish.processings, babl->fish.pixels);
 }
 
+static void
+fish_path_introspect (Babl *babl)
+{
+  babl_log ("\t\tcost:%f error:%.12f",
+            babl->fish_path.cost, babl->fish.error);
+
+  babl_list_each(babl->fish_path.conversion_list, each_introspect, NULL);
+}
+
 static int
 each_introspect (Babl *babl,
                  void *user_data)
@@ -209,6 +218,10 @@ each_introspect (Babl *babl,
       case BABL_FISH_SIMPLE:
         fish_introspect (babl);
         break;
+        
+      case BABL_FISH_PATH:
+        fish_path_introspect (babl);
+        break;
 
       default:
         break;
index 60cdf6eb2eb82da419c60cc8639127b4f938237e..69af9fcf28bfaff23accd264a65aaa42200380e4 100644 (file)
@@ -46,9 +46,10 @@ babl_list_insert_last (BablList *list,
 void
 babl_list_remove_last (BablList *list);
 
-#define babl_list_get_first(list) (list->items[0])
-#define babl_list_get_last(list)  (list->items[list->count-1])
+#define babl_list_get_n(list,n)   (list->items[(n)])
+#define babl_list_get_first(list) (babl_list_get_n(list,0))
 #define babl_list_size(list)      (list->count)
+#define babl_list_get_last(list)  (babl_list_get_n(list, babl_list_size(list)-1))
 
 void
 babl_list_copy (BablList *from,
index 6ceca90e664526bfb5a4ad3bda65dcb794466025..f0291e79b9667d2a1209e6afa9bb880df33b18de 100644 (file)
@@ -91,7 +91,9 @@ functions_sanity (void)
         }
       else
         {
-          babl_fatal ("babl memory function(s) attempted switched on the fly");
+          fprintf (stderr, "HMM....\nSomething strange is happening,\n%s function pointer changing between invocations in babl.\n",
+                   first_malloc_used == malloc_f ? "free" :
+                   (first_free_used == free_f ? "malloc" : "malloc and free"));
         }
     }
 }
index 1f7707678fb502fb2021770458ab54aed9b4312d..4c995df326fce43196ef8855bdee1464080111a2 100644 (file)
@@ -23,6 +23,7 @@
 #define NEEDS_BABL_DB
 #include "babl-internal.h"
 #include "babl-db.h"
+#include "babl-ref-pixels.h"
 
 static const Babl *construct_double_format (const Babl *model);
 
@@ -216,24 +217,6 @@ babl_model_new (void *first_argument,
 
 #define TOLERANCE      0.001
 
-#define test_pixels    512
-
-static double *
-test_create (void)
-{
-  double *test;
-  int     i;
-
-  srandom (20050728);
-
-  test = babl_malloc (sizeof (double) * test_pixels * 4);
-
-  for (i = 0; i < test_pixels * 4; i++)
-    test [i] = ((double) random () / RAND_MAX) * 1.4 - 0.2;
-
-  return test;
-}
-
 static const Babl *reference_format (void)
 {
   static const Babl *self = NULL;
@@ -289,7 +272,6 @@ double
 babl_model_is_symmetric (const Babl *cbabl)
 {
   Babl *babl = (Babl*)cbabl;
-  double *test;
   void   *original;
   double *clipped;
   void   *destination;
@@ -301,7 +283,9 @@ babl_model_is_symmetric (const Babl *cbabl)
   Babl *fish_to;
   Babl *fish_from;
 
-  test      = test_create ();
+  const int test_pixels = babl_get_num_model_test_pixels ();
+  const double *test = babl_get_model_test_pixels ();
+
   ref_fmt   = reference_format ();
   fmt       = construct_double_format (babl);
   fish_to   = babl_fish_reference (ref_fmt, fmt);
@@ -360,7 +344,6 @@ babl_model_is_symmetric (const Babl *cbabl)
   babl_free (clipped);
   babl_free (destination);
   babl_free (transformed);
-  babl_free (test);
   return symmetric;
 }
 
index 7e72eaa15398bbb192b33fe4c06975ca6c252d15..2f9bf8d6700e8b1347b57d6635fcd9e8ed8cede8 100644 (file)
@@ -19,7 +19,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
-#include <values.h>
+#include <limits.h>
 #include <assert.h>
 #include "config.h"
 #include "babl-internal.h"
diff --git a/babl/babl-ref-pixels.c b/babl/babl-ref-pixels.c
new file mode 100644 (file)
index 0000000..a8f7109
--- /dev/null
@@ -0,0 +1,81 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005 Øyvind Kolås
+ *               2013 Daniel Sabo
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "babl-ref-pixels.h"
+#include "babl-ref-pixels.inc"
+
+int
+babl_get_num_path_test_pixels (void)
+{
+  return babl_num_path_test_pixels;
+}
+
+int
+babl_get_num_conversion_test_pixels (void)
+{
+  return babl_num_conversion_test_pixels;
+}
+
+int
+babl_get_num_format_test_pixels (void)
+{
+  return babl_num_format_test_pixels;
+}
+
+int
+babl_get_num_model_test_pixels (void)
+{
+  return babl_num_model_test_pixels;
+}
+
+int
+babl_get_num_type_test_pixels (void)
+{
+  return babl_num_type_test_pixels;
+}
+
+const double *
+babl_get_path_test_pixels (void)
+{
+  return babl_path_test_pixels;
+}
+
+const double *
+babl_get_conversion_test_pixels (void)
+{
+  return babl_conversion_test_pixels;
+}
+
+const double *
+babl_get_format_test_pixels (void)
+{
+  return babl_format_test_pixels;
+}
+
+const double *
+babl_get_model_test_pixels (void)
+{
+  return babl_model_test_pixels;
+}
+
+const double *
+babl_get_type_test_pixels (void)
+{
+  return babl_type_test_pixels;
+}
diff --git a/babl/babl-ref-pixels.h b/babl/babl-ref-pixels.h
new file mode 100644 (file)
index 0000000..fe2e595
--- /dev/null
@@ -0,0 +1,34 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005-2008, Øyvind Kolås and others.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _BABL_REF_PIXELS_H
+#define _BABL_REF_PIXELS_H
+
+int babl_get_num_path_test_pixels (void);
+int babl_get_num_conversion_test_pixels (void);
+int babl_get_num_format_test_pixels (void);
+int babl_get_num_model_test_pixels (void);
+int babl_get_num_type_test_pixels (void);
+
+const double *babl_get_path_test_pixels (void);
+const double *babl_get_conversion_test_pixels (void);
+const double *babl_get_format_test_pixels (void);
+const double *babl_get_model_test_pixels (void);
+const double *babl_get_type_test_pixels (void);
+
+#endif /* _BABL_REF_PIXELS_H */
\ No newline at end of file
diff --git a/babl/babl-ref-pixels.inc b/babl/babl-ref-pixels.inc
new file mode 100644 (file)
index 0000000..5adf865
--- /dev/null
@@ -0,0 +1,1356 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005 Øyvind Kolås
+ *               2013 Daniel Sabo
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+/* THIS IS A GENERATED FILE - DO NOT EDIT */
+
+static const int babl_num_path_test_pixels = 3072;
+
+static const double babl_path_test_pixels[12288] = {
+0x1.87326f630e64ep-4, 0x1.d98b8203b317p-1, 0x1.80c353a70186ap-1, 0x1.8b30cef31661ap-1,
+0x1.ed4afa3bda95fp-1, 0x1.5b6f8b7eb6df1p-1, 0x1.a149bf2b42938p-2, 0x1.a42310c348462p-4,
+0x1.076180960ec3p-1, 0x1.70fdcafae1fb9p-2, 0x1.b56661636acccp-4, 0x1.e920a48bd2415p-1,
+0x1.6d6c669adad8dp-1, 0x1.db6bd983b6d7bp-3, 0x1.fcd15da3f9a2cp-4, 0x1.0228b6ca04517p-2,
+0x1.ef3cee63de79ep-1, 0x1.8dfaef231bf5ep-2, 0x1.5ee3acfebdc76p-1, 0x1.668783d6cd0fp-1,
+0x1.205f038640bep-1, 0x1.f9fa8d2ff3f52p-1, 0x1.20a64bea414c9p-1, 0x1.ee5b3f63dcb68p-2,
+0x1.2c44ab0a58895p-1, 0x1.927c053324f81p-3, 0x1.98d196cf31a33p-1, 0x1.4635fc0e8c6cp-1,
+0x1.7e5e224afcbc4p-1, 0x1.1a3f9972347f3p-3, 0x1.c6f50c538dea2p-3, 0x1.af4470375e88ep-1,
+0x1.00db42e201b68p-4, 0x1.f28096bfe5013p-1, 0x1.3a753f2674ea8p-1, 0x1.accc52835998ap-6,
+0x1.4df0223a9be04p-1, 0x1.6343d782c687bp-6, 0x1.07ab12b20f562p-3, 0x1.55468b42aa8d1p-3,
+0x1.873208730e641p-2, 0x1.e25e4373c4bc8p-3, 0x1.f3923ac3e7247p-4, 0x1.882b56831056bp-4,
+0x1.dee50e7bbdca2p-2, 0x1.f831cc33f063ap-3, 0x1.64338c6ac8672p-2, 0x1.bd5eeb3b7abddp-2,
+0x1.4509ea9e8a13dp-1, 0x1.0fd733421fae6p-5, 0x1.14dbe5c229b7dp-3, 0x1.95a3b8832b477p-3,
+0x1.5f000c02be002p-6, 0x1.65dd455acbba9p-1, 0x1.5c968dd2b92d2p-1, 0x1.373cab6a6e795p-1,
+0x1.ca7c46ab94f89p-1, 0x1.ead04943d5a09p-2, 0x1.f5ca9de3eb954p-3, 0x1.48da68f291b4dp-1,
+0x1.3bf80afe77f01p-1, 0x1.de5fd51bbcbfbp-2, 0x1.f03db24be07b6p-2, 0x1.5c13735eb826ep-1,
+0x1.c361029386c2p-2, 0x1.94a0c24329418p-4, 0x1.6979d5f2d2f3bp-1, 0x1.7d051c22fa0a4p-4,
+0x1.ed71b823dae37p-4, 0x1.ab649aa356c93p-1, 0x1.09e48caa13c92p-2, 0x1.01473b3e028e7p-1,
+0x1.1fe15be23fc2bp-4, 0x1.86c91b5b0d923p-2, 0x1.324ca60e64995p-1, 0x1.136eb2ba26dd6p-1,
+0x1.417100ba82e2p-1, 0x1.e4666c47c8ccep-1, 0x1.f21e2857e43c5p-1, 0x1.0cf5d6aa19ebbp-2,
+0x1.f563df7beac7cp-1, 0x1.baa90e2375522p-4, 0x1.d7c7b2ebaf8f6p-2, 0x1.6f7f6002defecp-11,
+0x1.9d32671f3a64dp-1, 0x1.21e99d1243d34p-3, 0x1.37988b466f311p-1, 0x1.67aeadc6cf5d6p-1,
+0x1.3de28be67bc51p-1, 0x1.b50b32bf6a166p-1, 0x1.61122d6ac2246p-2, 0x1.e76a5b93ced4bp-3,
+0x1.48763a9290ec7p-2, 0x1.a8a7efdb514fep-1, 0x1.d5ee0a43abdc1p-1, 0x1.85eb9e970bd74p-1,
+0x1.db3c0827b6781p-1, 0x1.3f67e0327ecfcp-1, 0x1.b58c421b6b188p-1, 0x1.8ea3f2831d47ep-5,
+0x1.d598f5a3ab31fp-2, 0x1.d3f44363a7e88p-4, 0x1.1a317a6a3462fp-1, 0x1.0ec8a64e1d915p-1,
+0x1.fbc62c33f78c6p-2, 0x1.31f881d263f1p-3, 0x1.11bac82223759p-4, 0x1.faa0b683f5417p-4,
+0x1.872465c30e48dp-4, 0x1.455815828ab03p-5, 0x1.8b9e044b173c1p-2, 0x1.324361826486cp-4,
+0x1.2eaa8c725d552p-3, 0x1.b1b2db9b6365bp-1, 0x1.352260626a44cp-4, 0x1.e8dd0a3fd1ba1p-1,
+0x1.fa2d42dff45a8p-1, 0x1.5e3cd752bc79bp-1, 0x1.508bb802a1177p-1, 0x1.380fcec6701fap-1,
+0x1.13480a0e26901p-1, 0x1.14ceb802299d7p-9, 0x1.b1ea65ab63d4dp-1, 0x1.b78327576f065p-1,
+0x1.a9bcbe9353798p-1, 0x1.87d86feb0fb0ep-1, 0x1.3d6ec5ea7add9p-1, 0x1.84f8c6b709f19p-1,
+0x1.8e80a0331d014p-2, 0x1.e5f61003cbec2p-2, 0x1.9de305e33bc61p-1, 0x1.b20ccaef64199p-1,
+0x1.2d79906e5af32p-1, 0x1.70290092e052p-2, 0x1.81aae2730355cp-2, 0x1.5ae53422b5ca7p-4,
+0x1.0492a0be09254p-1, 0x1.c61994838c333p-2, 0x1.aac2f5535585fp-3, 0x1.35772d7a6aee6p-1,
+0x1.eec49733dd893p-2, 0x1.307fbf7a60ff8p-1, 0x1.5bbf99aab77f3p-1, 0x1.430ceeba8619ep-1,
+0x1.c465362388ca7p-2, 0x1.8263e5b704c7dp-1, 0x1.2be9f8f657d3fp-1, 0x1.b8bfbbe3717f7p-2,
+0x1.c1417a0b8282fp-2, 0x1.f1d6c3d3e3ad8p-3, 0x1.46facb428df59p-5, 0x1.f3e8c713e7d19p-1,
+0x1.f629feb3ec54p-3, 0x1.c65a125f8cb42p-1, 0x1.ab6bee6b56d7ep-1, 0x1.3a39f2027473ep-4,
+0x1.4e3282469c65p-1, 0x1.d1b568a3a36adp-2, 0x1.ac4004f758801p-1, 0x1.572d25c2ae5a5p-5,
+0x1.dbd5bc57b7ab8p-1, 0x1.4a230ad694461p-1, 0x1.c77f9d4b8eff4p-1, 0x1.094f4cc2129eap-1,
+0x1.1bc58e02378b2p-8, 0x1.10aa1d0a21544p-2, 0x1.34abf34a6957ep-1, 0x1.06ca2bde0d945p-1,
+0x1.6b61d8c6d6c3bp-1, 0x1.9f5cb09f3eb96p-1, 0x1.e20acaa3c4159p-4, 0x1.8b10917316212p-3,
+0x1.9fb8e0333f71cp-2, 0x1.9800f2ff3001ep-1, 0x1.a5d113174ba22p-1, 0x1.b20f0b2b641e1p-1,
+0x1.1a64d8b634c9bp-1, 0x1.a376181346ec3p-2, 0x1.1cddd23239bbap-2, 0x1.fb0595bbf60b3p-1,
+0x1.4e30bd029c618p-1, 0x1.45bd2b9a8b7a5p-2, 0x1.eeee5ccfdddccp-1, 0x1.cbbb3caf97768p-1,
+0x1.a4e2a0a349c54p-3, 0x1.9a5a4b3734b49p-1, 0x1.f3027aefe604fp-1, 0x1.b76b2a6f6ed65p-1,
+0x1.0669ff0a0cd4p-2, 0x1.9f427fe73e85p-1, 0x1.ccddfccf99bcp-1, 0x1.7c2aef62f855ep-3,
+0x1.d2cb1573a5963p-2, 0x1.945d9a1728bb3p-1, 0x1.685a089ed0b41p-1, 0x1.d73a2bb3ae745p-2,
+0x1.cb2a898396551p-5, 0x1.3a0bf7ca7417fp-2, 0x1.f26741b7e4ce8p-1, 0x1.8814815f1029p-1,
+0x1.e3156403c62adp-4, 0x1.7544d842ea89bp-4, 0x1.ead8a5bfd5b15p-1, 0x1.0c3f1c9a187e4p-1,
+0x1.c6a98e078d532p-1, 0x1.90a9b8d321537p-1, 0x1.7c9c4f8af938ap-2, 0x1.c21ccd738439ap-2,
+0x1.8993137313262p-3, 0x1.4cbd10de997a2p-1, 0x1.b827f8eb704ffp-2, 0x1.b09581df612bp-1,
+0x1.ef9ba6afdf375p-1, 0x1.9604b2832c096p-2, 0x1.7c50be8af8a18p-1, 0x1.63513b52c6a27p-3,
+0x1.957291d32ae52p-3, 0x1.6f53397adea67p-1, 0x1.03f7944207ef3p-5, 0x1.d12347f3a2469p-2,
+0x1.0e95b95e1d2b7p-1, 0x1.dd1d7613ba3afp-1, 0x1.479c5fd68f38cp-1, 0x1.f7fb4417eff69p-1,
+0x1.717b1026e2f62p-1, 0x1.5fecd0e2bfd9ap-2, 0x1.c730b3db8e616p-2, 0x1.8e2db8c31c5b7p-1,
+0x1.4cfc645699f8dp-1, 0x1.abff374357fe7p-2, 0x1.16423a1e2c847p-1, 0x1.895f10d712be2p-1,
+0x1.04a836aa09507p-1, 0x1.011adfda0235cp-1, 0x1.2b3c5ae25678bp-2, 0x1.96a389632d471p-2,
+0x1.2389315a47126p-2, 0x1.53ec5536a7d8bp-1, 0x1.ac602b6b58c05p-1, 0x1.e852bb13d0a57p-2,
+0x1.4152cc2282a5ap-2, 0x1.10e84fba21d0ap-2, 0x1.497dbeca92fb8p-2, 0x1.208a197a41143p-2,
+0x1.5376811ea6edp-1, 0x1.087cef6210f9ep-4, 0x1.d232b72ba4657p-2, 0x1.b8d3259371a65p-1,
+0x1.9062d76720c5bp-1, 0x1.f2b1a9b3e5635p-2, 0x1.42c9931a85932p-2, 0x1.3df121827be24p-2,
+0x1.acec95d359d93p-2, 0x1.e9012963d2025p-1, 0x1.2de7a9b25bcf5p-2, 0x1.1fc56c323f8aep-3,
+0x1.31ef23a263de4p-2, 0x1.7a8c2ec6f5186p-1, 0x1.d61f13cfac3e2p-1, 0x1.e5f3f627cbe7fp-1,
+0x1.422f29a2845e5p-3, 0x1.d8c29bdbb1853p-2, 0x1.6f5306fadea61p-1, 0x1.55340112aa68p-1,
+0x1.ed7c2dc7daf86p-1, 0x1.3c4d1a02789a3p-7, 0x1.042e2e02085c6p-4, 0x1.fd0319c3fa063p-3,
+0x1.58dd899eb1bb1p-1, 0x1.cce5f12f99cbep-1, 0x1.736a23fae6d44p-1, 0x1.f986efb3f30dep-1,
+0x1.55686422aad0dp-3, 0x1.829035c305207p-5, 0x1.1397f8da272ffp-2, 0x1.a8d09a2b51a13p-1,
+0x1.c9c50a63938a1p-4, 0x1.72e55802e5cabp-1, 0x1.61a3bfbac3478p-1, 0x1.c99b78b39336fp-1,
+0x1.b0f8b36361f16p-3, 0x1.8444a20308894p-8, 0x1.a25025d344a05p-3, 0x1.42b477c28568fp-1,
+0x1.ec09b2a7d8136p-1, 0x1.ff0fbc9bfe1f8p-2, 0x1.8aa5d2d3154bap-1, 0x1.0a0288ea14051p-2,
+0x1.e8503443d0a07p-3, 0x1.60c4e69ec189dp-1, 0x1.abd4ea6357a9dp-3, 0x1.953faef32a7f6p-2,
+0x1.3498d2226931ap-3, 0x1.da484197b4908p-1, 0x1.fd3d88c3fa7b1p-5, 0x1.d5131283aa262p-4,
+0x1.df3975ffbe72fp-1, 0x1.0166793202ccfp-3, 0x1.73c65182e78cap-2, 0x1.3816ff9e702ep-1,
+0x1.a7f1ef034fe3ep-6, 0x1.6a6a65e2d4d4dp-4, 0x1.319def4e633bep-1, 0x1.8a66a21314cd4p-3,
+0x1.15d940622bb28p-3, 0x1.bb69ebbb76d3dp-1, 0x1.6d485582da90bp-6, 0x1.fabbc593f5779p-3,
+0x1.2e4f43be5c9e8p-1, 0x1.6d0e0266da1cp-1, 0x1.2129a86242535p-3, 0x1.9a8d7097351aep-1,
+0x1.70168baee02d1p-1, 0x1.61bce71ac379dp-2, 0x1.ba83d0b37507ap-2, 0x1.5c203e52b8408p-1,
+0x1.b06651db60ccap-1, 0x1.9f9eeca33f3dep-3, 0x1.e12182cbc243p-1, 0x1.53d2f742a7a5fp-4,
+0x1.c8aca1c791594p-1, 0x1.305af58260b5fp-3, 0x1.ea346ccbd468ep-2, 0x1.5d2d6502ba5adp-5,
+0x1.32f7f7a265effp-4, 0x1.14ee0ef229dc2p-1, 0x1.41d4e28283a9cp-3, 0x1.661d3d02cc3a8p-7,
+0x1.5547ad3eaa8f6p-1, 0x1.0a58616214b0cp-1, 0x1.3daf74927b5efp-1, 0x1.62873cbac50e8p-1,
+0x1.37a5ae1e6f4b6p-1, 0x1.bd358f737a6b2p-3, 0x1.c520e53f8a41dp-1, 0x1.7d1bfe3afa38p-1,
+0x1.55ba7ca2ab75p-4, 0x1.d08b27eba1165p-1, 0x1.fbcaef9ff795ep-1, 0x1.59069352b20d2p-1,
+0x1.3d992a4e7b325p-1, 0x1.105566d220aadp-3, 0x1.e72807d3ce501p-2, 0x1.5b5f6bf2b6bedp-2,
+0x1.e9e79a83d3cf3p-2, 0x1.d0d5ec43a1abep-1, 0x1.39fe898273fd1p-6, 0x1.4ab43e3295688p-2,
+0x1.c5ed3b438bda7p-4, 0x1.eaf17717d5e2fp-1, 0x1.9fa8fc0b3f52p-2, 0x1.6a492c02d4926p-9,
+0x1.b841a3a370834p-4, 0x1.c4eeb46b89dd7p-1, 0x1.73d1f7c2e7a3fp-5, 0x1.759ccdb2eb39ap-3,
+0x1.b3b986b367731p-2, 0x1.9ec960733d92cp-3, 0x1.8bfea18317fd4p-3, 0x1.792384a2f2471p-4,
+0x1.720ab982e4157p-1, 0x1.a0af1cf3415e4p-1, 0x1.91abad4f23576p-1, 0x1.5360cf3aa6c1ap-2,
+0x1.ff901983ff203p-6, 0x1.56cc928aad992p-1, 0x1.36632ea26cc66p-4, 0x1.d59e8303ab3dp-4,
+0x1.2757ba724eaf7p-1, 0x1.14baaba229755p-4, 0x1.93ba63b72774cp-1, 0x1.93c3930327872p-3,
+0x1.9ab2bca335658p-3, 0x1.0e9ccf3a1d39ap-2, 0x1.12a09aba25413p-1, 0x1.5ba07c6eb741p-1,
+0x1.60914f72c122ap-3, 0x1.1c708f0638e12p-1, 0x1.f5370803ea6e1p-10, 0x1.21c3f68a4387fp-2,
+0x1.0762061a0ec41p-1, 0x1.a19e3313433c6p-2, 0x1.249888e249311p-2, 0x1.3e6a3a927cd47p-1,
+0x1.2b7b9be256f73p-2, 0x1.5312c7e2a6259p-2, 0x1.9bd16dff37a2ep-1, 0x1.6f9a914adf352p-1,
+0x1.113bbc0e22778p-1, 0x1.fed1165ffda23p-1, 0x1.9ebf01e33d7ep-1, 0x1.068ceb1a0d19dp-2,
+0x1.9f80334f3f006p-1, 0x1.306aaf2e60d56p-1, 0x1.2cf6dd2e59edcp-1, 0x1.af7cb41b5ef97p-1,
+0x1.0e6e83721cddp-2, 0x1.53c34302a7868p-1, 0x1.ea30847bd4611p-1, 0x1.ae8efc2b5d1ep-1,
+0x1.765a9876ecb53p-1, 0x1.7deae82efbd5dp-1, 0x1.37fe0e826ffc2p-5, 0x1.dd0747a3ba0e9p-1,
+0x1.4e53f2029ca7ep-7, 0x1.26207ba64c40fp-1, 0x1.38a7c40e714f9p-1, 0x1.75768e92eaed2p-3,
+0x1.0a442aa214885p-3, 0x1.39a25f927344cp-1, 0x1.dc7f3dd3b8fe8p-2, 0x1.49f310c693e62p-1,
+0x1.4e2f23829c5e4p-6, 0x1.808be35f0117cp-1, 0x1.10ba96aa21753p-2, 0x1.405e8e1a80bd2p-2,
+0x1.50aa3a62a1547p-4, 0x1.2175ca8242eb9p-4, 0x1.f93b0b03f2761p-6, 0x1.3b51035a76a2p-1,
+0x1.17fe7d622ffdp-4, 0x1.ae88da3b5d11bp-1, 0x1.be9778eb7d2efp-1, 0x1.c28002fb85p-1,
+0x1.bde712cb7bce2p-2, 0x1.d71cac2bae396p-2, 0x1.71fcb712e3f97p-1, 0x1.662acb1ecc559p-1,
+0x1.fa8cc8a3f5199p-4, 0x1.5c2d3b8ab85a7p-1, 0x1.14b9c74a29739p-1, 0x1.b5ac318f6b586p-1,
+0x1.b430477368609p-2, 0x1.2839a83250735p-1, 0x1.92b3792f2566fp-1, 0x1.bea2e7037d45dp-2,
+0x1.39688f5272d12p-3, 0x1.96b67a732d6cfp-2, 0x1.3caf172a795e3p-1, 0x1.21d65d0243accp-2,
+0x1.3f6732027ece6p-7, 0x1.5775b082aeeb6p-4, 0x1.dade3f47b5bc8p-1, 0x1.ede2bc83dbc58p-6,
+0x1.ab7a996f56f53p-1, 0x1.8cee2a6319dc5p-3, 0x1.5f3cb9eabe797p-2, 0x1.d58fe0bbab1fcp-1,
+0x1.0ed487d21da91p-2, 0x1.7ed06a9afda0dp-2, 0x1.10e0e41621c1dp-1, 0x1.54d4272aa9a85p-2,
+0x1.b7c43e136f888p-3, 0x1.9ef0b9fb3de17p-2, 0x1.b3a85a336750bp-3, 0x1.4ce498ea99c93p-1,
+0x1.bb06b313760d6p-1, 0x1.dee6cd9fbdcdap-1, 0x1.661ec812cc3d9p-2, 0x1.fa584c27f4b0ap-1,
+0x1.3b14092676281p-1, 0x1.c7c92b538f925p-1, 0x1.b0047db36009p-1, 0x1.52c2cdc2a585ap-5,
+0x1.e005a703c00b5p-2, 0x1.42b7f6de856ffp-1, 0x1.e8fb40c3d1f68p-2, 0x1.3e5cf75a7cb9fp-1,
+0x1.c266828384cdp-6, 0x1.8965bc4312cb8p-4, 0x1.cf4825db9e905p-1, 0x1.310d0e02621a2p-5,
+0x1.706db662e0db7p-3, 0x1.aa26651f544cdp-1, 0x1.13ff362227fe7p-4, 0x1.e581c203cb038p-7,
+0x1.ac3df683587bfp-6, 0x1.a43c877348791p-2, 0x1.dd25e7c3ba4bdp-1, 0x1.2998673a5330dp-2,
+0x1.91867907230cfp-1, 0x1.dc0d97abb81b3p-2, 0x1.3f3647327e6c9p-1, 0x1.ff77888bfeef1p-1,
+0x1.bd7f28d37afe5p-1, 0x1.ac205dbf5840cp-1, 0x1.4c5c217698b84p-1, 0x1.7885dbe2f10bbp-1,
+0x1.8b072b5b160e5p-1, 0x1.ff6b857ffed71p-1, 0x1.72de280ae5bc5p-1, 0x1.8c3668fb186cdp-2,
+0x1.c734b0cf8e696p-1, 0x1.22e2a5ba45c55p-1, 0x1.b68ec2bb6d1d8p-2, 0x1.6e6f089adcde1p-2,
+0x1.966a72632cd4ep-3, 0x1.cfc501bf9f8ap-1, 0x1.f5947ba7eb28fp-1, 0x1.ceb742b39d6e8p-3,
+0x1.e3728803c6e51p-10, 0x1.c4dca17f89b94p-1, 0x1.0d7d431a1afa8p-2, 0x1.74349b72e8693p-3,
+0x1.6f03069ade061p-1, 0x1.527d10aaa4fa2p-2, 0x1.928cb79325197p-3, 0x1.7c64f64ef8c9fp-1,
+0x1.7b5ccc0ef6b9ap-1, 0x1.072456a20e48bp-3, 0x1.13129e8226254p-5, 0x1.0ce3451619c69p-1,
+0x1.2fcfe17e5f9fcp-1, 0x1.5067711aa0ceep-1, 0x1.0c5acd9e18b5ap-1, 0x1.da9e14a3b53c3p-2,
+0x1.f90f9dabf21f4p-2, 0x1.62dbbc42c5b78p-3, 0x1.975398c32ea73p-3, 0x1.0f1df45a1e3bfp-2,
+0x1.6089d232c113ap-3, 0x1.d8b30e3bb1662p-1, 0x1.4daa2eae9b546p-1, 0x1.f5725583eae4bp-5,
+0x1.f72b67ebee56dp-2, 0x1.478c80428f19p-4, 0x1.ad1d53535a3aap-2, 0x1.6130508ec260ap-1,
+0x1.f8b691c7f16d2p-1, 0x1.98464a9b308c9p-2, 0x1.d4de213ba9bc4p-1, 0x1.f9a84b0bf3509p-1,
+0x1.21ff8d9a43ff2p-2, 0x1.6e730b22dce61p-3, 0x1.5ad5c792b5ab9p-3, 0x1.66b20002cd64p-16,
+0x1.04db4b1e09b69p-1, 0x1.76b13f9aed628p-2, 0x1.7c67c3b6f8cf8p-1, 0x1.00702e5200e06p-2,
+0x1.fa436aebf486dp-2, 0x1.8d98ed9f1b31ep-1, 0x1.8d1b5c3f1a36cp-1, 0x1.678cb782cf197p-4,
+0x1.bc00bd7378018p-2, 0x1.32ec53ba65d8ap-2, 0x1.1a40a14234814p-1, 0x1.da882d8fb5106p-1,
+0x1.e45a31dbc8b46p-2, 0x1.80158777002b1p-1, 0x1.885c9ef310b94p-3, 0x1.4a4f8d7e949f2p-1,
+0x1.58c895aeb1913p-1, 0x1.afc1566b5f82bp-1, 0x1.69a6b2d6d34d6p-1, 0x1.51792682a2f25p-3,
+0x1.d8b2e673b165dp-1, 0x1.00d571f201aaep-3, 0x1.b58e9a2f6b1d3p-1, 0x1.d1697837a2d2fp-1,
+0x1.0c5881ce18b1p-1, 0x1.8a6cbb6b14d97p-1, 0x1.cb11c33f96238p-1, 0x1.9d58489b3ab09p-1,
+0x1.e6097e33cc13p-1, 0x1.0e39a9021c735p-4, 0x1.9d5b15ff3ab63p-1, 0x1.d5c9929bab932p-2,
+0x1.ba3fa9db747f5p-2, 0x1.19c2d9b23385bp-1, 0x1.6b1ce076d639cp-1, 0x1.da418a63b4831p-1,
+0x1.4eb78ea29d6f2p-2, 0x1.f070796be0e0fp-2, 0x1.ccc855039990bp-7, 0x1.855c260b0ab85p-1,
+0x1.91ae6693235cdp-1, 0x1.2173c29642e78p-1, 0x1.5fe45396bfc8ap-1, 0x1.07b6fefa0f6ep-2,
+0x1.4312941286253p-2, 0x1.c1fb7b5383f6fp-1, 0x1.ce2b0cfb9c562p-1, 0x1.fa51dfbbf4a3cp-1,
+0x1.71bcd1bae379ap-1, 0x1.37d1bfd26fa38p-1, 0x1.3ac0a56275815p-3, 0x1.4a6fb82a94df7p-1,
+0x1.78071c4ef00e4p-1, 0x1.0fb0e2021f61cp-7, 0x1.1bd9305e37b26p-1, 0x1.08bf3c32117e8p-2,
+0x1.8eab7ef31d57p-1, 0x1.cdd5e7339babdp-2, 0x1.0dbf35821b7e7p-4, 0x1.74b4fd22e96ap-1,
+0x1.08b228be11645p-1, 0x1.bf12fcb37e26p-1, 0x1.7e6719b2fcce3p-3, 0x1.e5d1fdabcba4p-1,
+0x1.b1abacc363576p-2, 0x1.cab6a6e3956d5p-1, 0x1.c013880f80271p-1, 0x1.80319db300634p-1,
+0x1.85ddc72b0bbb9p-2, 0x1.c746a9638e8d5p-1, 0x1.058dc3ba0b1b8p-1, 0x1.52752892a4ea5p-3,
+0x1.d174d7eba2e9bp-2, 0x1.95c85d432b90cp-3, 0x1.b0f1934b61e32p-2, 0x1.8a43b60314877p-1,
+0x1.3b6c950276d93p-4, 0x1.4d47ad3a9a8f6p-2, 0x1.849595bb092b3p-1, 0x1.992a645f3254dp-1,
+0x1.de75966fbceb3p-1, 0x1.d345bf13a68b8p-1, 0x1.c734390b8e687p-2, 0x1.567cb2beacf96p-1,
+0x1.d784829baf09p-1, 0x1.ff734ce7fee6ap-1, 0x1.dadc50d7b5b8ap-1, 0x1.6630018acc6p-1,
+0x1.ccbc80fb9979p-2, 0x1.fc94378bf9287p-1, 0x1.b5c9fd536b94p-2, 0x1.ef10693bde20dp-1,
+0x1.bba7343b774e7p-1, 0x1.3a7ec51674fd9p-1, 0x1.d4e266e7a9c4dp-1, 0x1.28fa153251f43p-2,
+0x1.05356bfa0a6adp-1, 0x1.94f5eef329ebep-1, 0x1.4aea84c295d51p-5, 0x1.c8244f8f9048ap-1,
+0x1.5c3c9852b8793p-1, 0x1.1a3c6c063478ep-1, 0x1.cc199b4398333p-5, 0x1.13dc111227b82p-3,
+0x1.7fae8356ff5dp-1, 0x1.ea74c6b3d4e99p-2, 0x1.cf3aba479e757p-1, 0x1.a71c15fb4e383p-1,
+0x1.9bde39f737bc7p-1, 0x1.53d04ffea7a0ap-1, 0x1.40467a56808cfp-1, 0x1.7a53d066f4a7ap-1,
+0x1.27160f124e2c2p-1, 0x1.1f04b6c23e097p-4, 0x1.a1a1064343421p-2, 0x1.fd352353fa6a4p-2,
+0x1.1a9f1de2353e4p-4, 0x1.5759a7eaaeb35p-2, 0x1.932a4cd32654ap-3, 0x1.09b2243e13645p-1,
+0x1.508216faa1043p-2, 0x1.3faf91de7f5f2p-1, 0x1.f1851aebe30a3p-2, 0x1.8fa0fed31f42p-3,
+0x1.e8b95bd3d172bp-3, 0x1.9b49e8b33693dp-2, 0x1.f0ca94a3e1953p-2, 0x1.7f63c2eefec78p-1,
+0x1.8a6b8d2314d72p-3, 0x1.0d13f29e1a27ep-1, 0x1.4788127a8f102p-1, 0x1.bed77b9b7daefp-1,
+0x1.3a82f5027505fp-4, 0x1.6449ac2ec8936p-1, 0x1.e73ff003ce7fep-8, 0x1.a6fee1fb4dfdcp-1,
+0x1.66103e12cc208p-3, 0x1.d3093a27a6127p-1, 0x1.4e1af7f29c35fp-1, 0x1.f562497feac49p-1,
+0x1.26d98a264db31p-1, 0x1.1cc2e48a3985dp-2, 0x1.6fb619e2df6c3p-1, 0x1.37be64d26f7cdp-3,
+0x1.6484123ac9082p-2, 0x1.021a74020434fp-3, 0x1.4c8a2ade99145p-1, 0x1.ab2bd9bb5657bp-2,
+0x1.d866e1ebb0cdcp-2, 0x1.b154be1362a98p-1, 0x1.df48111bbe902p-1, 0x1.94747c7728e9p-1,
+0x1.e2089fe3c4114p-2, 0x1.b0153d1b602a8p-2, 0x1.f85cbc2bf0b98p-1, 0x1.6b32a6e6d6655p-1,
+0x1.a5af92eb4b5f2p-1, 0x1.e1840cf3c3082p-2, 0x1.d52cd3a3aa59ap-2, 0x1.094ec602129d9p-6,
+0x1.fdd5f917fbabfp-1, 0x1.90f3e24321e7cp-4, 0x1.c721f1cf8e43ep-1, 0x1.2932bdc252658p-4,
+0x1.9668287b2cd05p-1, 0x1.caf071af95e0ep-1, 0x1.cc2539b3984a7p-1, 0x1.efec37ffdfd87p-1,
+0x1.9df9abd33bf35p-1, 0x1.1a4031a234806p-1, 0x1.e54e817bca9dp-1, 0x1.89a66beb134cdp-2,
+0x1.a8a1a3e751434p-1, 0x1.55049b5aaa093p-1, 0x1.12c2cf2a2585ap-1, 0x1.6b8eb402d71d7p-3,
+0x1.958b385b2b167p-1, 0x1.7d33e822fa67dp-3, 0x1.307999de60f33p-1, 0x1.037d52a206faap-2,
+0x1.0a1b81821437p-5, 0x1.0fc1aaf61f835p-1, 0x1.63325c42c664cp-5, 0x1.01a6080a034c1p-1,
+0x1.e7cc4987cf989p-1, 0x1.d1fc3d83a3f88p-6, 0x1.b362bbb366c57p-3, 0x1.8d7bdc6f1af7cp-1,
+0x1.fea3d0d3fd47ap-2, 0x1.576f18beaede3p-1, 0x1.95c6529f2b8cap-1, 0x1.fa4fc2fbf49f8p-2,
+0x1.898d950b131b3p-1, 0x1.5ce8446ab9d09p-1, 0x1.224e3936449c7p-1, 0x1.1ff5bd823feb8p-1,
+0x1.27d8b6164fb17p-1, 0x1.dce6e5cbb9cddp-2, 0x1.0fe1f57e1fc3fp-1, 0x1.8ba4c3d317498p-2,
+0x1.167490822ce92p-6, 0x1.ea60edf3d4c1ep-2, 0x1.8aa597df154b3p-1, 0x1.b155486b62aa9p-1,
+0x1.28d4494251a89p-3, 0x1.3ad0ce1275a1ap-2, 0x1.871ead830e3d6p-6, 0x1.dfc04aafbf809p-1,
+0x1.f96ac223f2d58p-2, 0x1.3cb28f4a79652p-1, 0x1.85fbcff30bf7ap-3, 0x1.0d57192a1aae3p-1,
+0x1.31d0e90263a1dp-3, 0x1.dec86703bd90dp-3, 0x1.dfa42683bf485p-6, 0x1.a2041e2344084p-4,
+0x1.0c83f75a1907fp-2, 0x1.ef574083deae8p-3, 0x1.c1bc60338378cp-1, 0x1.8593e4170b27dp-1,
+0x1.d344e8e3a689dp-1, 0x1.5782b2ceaf056p-1, 0x1.05778b2a0aef1p-2, 0x1.5cd27deab9a5p-1,
+0x1.68d5ee72d1abep-2, 0x1.a509fecb4a14p-1, 0x1.f320eda3e641ep-3, 0x1.dc43ad4fb8876p-1,
+0x1.26fae3624df5cp-2, 0x1.8caa30e719546p-1, 0x1.442c1e6a88584p-2, 0x1.38622c6a70c46p-2,
+0x1.03b54fba076aap-2, 0x1.65dd38a2cbba7p-4, 0x1.36197a826c32fp-3, 0x1.981f7463303efp-2,
+0x1.94481c3b28904p-2, 0x1.66fd5032cdfaap-3, 0x1.57a009baaf401p-2, 0x1.c6d96f2f8db2ep-1,
+0x1.9671e3572ce3cp-1, 0x1.0d4ef8da1a9dfp-1, 0x1.a86110ab50c22p-2, 0x1.e2e61d97c5cc4p-1,
+0x1.8501129b0a022p-1, 0x1.c65b53138cb6ap-2, 0x1.726a1582e4d43p-5, 0x1.6861c882d0c39p-6,
+0x1.5f0379aebe06fp-1, 0x1.d8e3018bb1c6p-1, 0x1.90d6f25f21adep-1, 0x1.3248628e6490cp-1,
+0x1.3065b45a60cb7p-1, 0x1.392b7f027257p-5, 0x1.1e35c0ea3c6b8p-2, 0x1.e4d0ab93c9a15p-1,
+0x1.b89cb6bb71397p-1, 0x1.0be31bde17c63p-1, 0x1.c11458df8228bp-1, 0x1.3068a1a260d14p-3,
+0x1.311a998262353p-2, 0x1.8ca9a05319534p-3, 0x1.d0967d43a12dp-2, 0x1.1a67f4a234cffp-1,
+0x1.1fcc1e523f984p-2, 0x1.35d19d426ba34p-1, 0x1.e677aed3ccef6p-1, 0x1.5a0a1d46b4144p-1,
+0x1.8f90f14f1f21ep-1, 0x1.248f675a491edp-2, 0x1.20e38c7241c72p-1, 0x1.2602d4a24c05bp-1,
+0x1.9f96ac873f2d6p-1, 0x1.f51414c7ea283p-1, 0x1.08e8f23a11d1ep-1, 0x1.2497bf1e492f8p-1,
+0x1.b0837ca36107p-2, 0x1.200f9392401f2p-1, 0x1.2fdacd625fb5ap-1, 0x1.ba29bfe374538p-4,
+0x1.f1e52a3be3ca5p-2, 0x1.81637f7b02c7p-2, 0x1.698d9a8ad31b3p-1, 0x1.4ac24ba295849p-4,
+0x1.a888ef5b5111ep-2, 0x1.f8a87afff150fp-1, 0x1.c51ea0838a3d4p-6, 0x1.19c25cd23384cp-2,
+0x1.048b96da09173p-1, 0x1.cf3d4de39e7aap-1, 0x1.b1f6ada363ed6p-2, 0x1.9d18e39b3a31cp-1,
+0x1.933dafa3267b6p-4, 0x1.c1469573828d3p-1, 0x1.6f01b072de036p-2, 0x1.849b8a3b09371p-2,
+0x1.ee306563dc60dp-2, 0x1.3bf10e1277e22p-2, 0x1.c57e26038afc5p-5, 0x1.0d5247fa1aa49p-2,
+0x1.30403ab660807p-1, 0x1.3d3b6ed27a76ep-1, 0x1.acabf8a35957fp-1, 0x1.9fadce733f5bap-2,
+0x1.324f839a649fp-1, 0x1.6b29d5b2d653bp-2, 0x1.f46ea657e8dd5p-1, 0x1.52283d02a4508p-6,
+0x1.d5a47e6bab49p-1, 0x1.244973ba4892ep-1, 0x1.0759e7920eb3dp-3, 0x1.9d2e270b3a5c5p-2,
+0x1.e4fb3377c9f66p-1, 0x1.ab64146f56c83p-1, 0x1.efdeb9f3dfbd7p-2, 0x1.727f564ae4febp-2,
+0x1.a40c8f6b48192p-1, 0x1.061851fe0c30ap-1, 0x1.4620d98e8c41bp-1, 0x1.51304c82a260ap-2,
+0x1.aaab3fc355568p-2, 0x1.f1c305c3e3861p-5, 0x1.16c427622d885p-3, 0x1.07bd55d60f7abp-1,
+0x1.e062c5d3c0c59p-1, 0x1.fa63c42bf4c79p-2, 0x1.ca0b1af794163p-1, 0x1.aef5f1035debep-2,
+0x1.9b2a691f3654dp-1, 0x1.e662fd57ccc6p-1, 0x1.5e241c82bc484p-1, 0x1.96d547ab2daa9p-2,
+0x1.239e6c2a473cep-1, 0x1.0ad0152215a03p-1, 0x1.9b418b0f36831p-1, 0x1.57b7bf02af6f8p-3,
+0x1.c064fffb80cap-1, 0x1.8fb031671f606p-1, 0x1.81fcc6a303f99p-3, 0x1.96097e632c13p-1,
+0x1.67f34a3acfe69p-2, 0x1.44ab571a8956bp-2, 0x1.928247a325049p-3, 0x1.31e9b12263d36p-2,
+0x1.36e6ffe26dcep-3, 0x1.5c8feee2b91fep-1, 0x1.523483b6a469p-1, 0x1.f1c64f63e38cap-1,
+0x1.8aa103831542p-3, 0x1.30aaba8261557p-2, 0x1.34bceb426979dp-2, 0x1.37fde0c26ffbcp-1,
+0x1.6ee31b42ddc63p-2, 0x1.c01efef3803ep-2, 0x1.fdd9b4a3fbb37p-4, 0x1.2fa8a6e25f515p-2,
+0x1.dd41618fba82cp-1, 0x1.38ca310271946p-6, 0x1.6f4f4bf2de9e9p-1, 0x1.786bcaaef0d79p-1,
+0x1.f0294ee3e052ap-1, 0x1.9ae6d0e335cdap-2, 0x1.0f59ba021eb37p-3, 0x1.13c7bb0a278f7p-1,
+0x1.d8437d93b087p-1, 0x1.df17f98fbe2ffp-1, 0x1.69b5aacad36b5p-1, 0x1.98a87d8b3151p-1,
+0x1.6ec82af2dd905p-1, 0x1.ca34dc739469cp-1, 0x1.2eb1fbee5d63fp-1, 0x1.160e80622c1dp-4,
+0x1.b22a1ff364544p-3, 0x1.93528dd726a52p-1, 0x1.776d5142eedaap-2, 0x1.74888feae9112p-2,
+0x1.dfc4f96bbf89fp-2, 0x1.bd658a837acb1p-6, 0x1.58152eaab02a6p-2, 0x1.528abd96a5158p-1,
+0x1.4c81133299022p-2, 0x1.46690cf68cd22p-1, 0x1.15113caa2a228p-2, 0x1.5db2173abb643p-1,
+0x1.33c463626788cp-4, 0x1.9487a9db290f5p-2, 0x1.f5866aabeb0cdp-1, 0x1.dcf6fe03b9eep-8,
+0x1.a8144ceb5028ap-2, 0x1.64d5b69ac9ab7p-1, 0x1.7c25b8aaf84b7p-1, 0x1.8866eaab10cddp-2,
+0x1.9248f8632491fp-4, 0x1.bffc272b7ff85p-1, 0x1.d7fb305faff66p-1, 0x1.51939382a3272p-6,
+0x1.9f1420b73e284p-1, 0x1.41b0db268361bp-1, 0x1.a3351a2b466a3p-1, 0x1.0ddc4baa1bb89p-1,
+0x1.0be5b79617cb7p-1, 0x1.a3ce2c2b479c6p-2, 0x1.309e1bb6613c3p-1, 0x1.78703f92f0e08p-1,
+0x1.94e68fa329cd2p-3, 0x1.ec54c457d8a99p-1, 0x1.95a43c232b488p-4, 0x1.551c209eaa384p-1,
+0x1.fa3ff0aff47fep-1, 0x1.bd7e3db37afc8p-2, 0x1.4f4dbc6a9e9b8p-2, 0x1.4100f48a8201fp-2,
+0x1.29415e625282cp-4, 0x1.322f7c8a645fp-1, 0x1.fe32917ffc652p-1, 0x1.2e82e0f25d05cp-3,
+0x1.fc735177f8e6ap-1, 0x1.f3b8fc27e772p-1, 0x1.3d6a98e27ad53p-3, 0x1.a0faefdb41f5ep-2,
+0x1.588eb2beb11d6p-1, 0x1.cb805ee39700cp-1, 0x1.94b0ed432961ep-1, 0x1.8ad7d1cb15afap-1,
+0x1.8b7c860b16f91p-1, 0x1.6cac1da2d9584p-1, 0x1.95646e6b2ac8ep-1, 0x1.2a90a6be55215p-1,
+0x1.5cb9f18ab973ep-2, 0x1.3899889271331p-1, 0x1.c367932386cf2p-4, 0x1.ba42b05f74856p-1,
+0x1.5013d482a027bp-6, 0x1.690b0e1ed2162p-1, 0x1.32b2efee6565ep-1, 0x1.bee90a337dd21p-3,
+0x1.555fd272aabfap-1, 0x1.65677776cacefp-1, 0x1.c4d6632b89accp-1, 0x1.4f9fc31e9f3f8p-1,
+0x1.109a59322134bp-3, 0x1.b1f5057363ea1p-3, 0x1.f0203d63e0408p-1, 0x1.a53b08734a761p-3,
+0x1.9eacbdeb3d598p-1, 0x1.ee52cedfdca5ap-1, 0x1.69def4b2d3bdfp-2, 0x1.9b200f5f36402p-1,
+0x1.e20bcb03c4179p-1, 0x1.044a209208944p-1, 0x1.ae761d235cec4p-3, 0x1.3a9a7dc27535p-1,
+0x1.9f94fee33f2ap-2, 0x1.39d2300273a46p-11, 0x1.8ae49f1315c94p-2, 0x1.6d1c15e2da383p-3,
+0x1.6cfa922ed9f52p-1, 0x1.6b5af7c2d6b5fp-3, 0x1.85d7ac370baf6p-1, 0x1.b578af036af16p-5,
+0x1.9370468326e09p-1, 0x1.be449e9f7c894p-1, 0x1.d59a3b4fab347p-1, 0x1.9df0e5273be1dp-1,
+0x1.274facba4e9f6p-1, 0x1.084d2b3e109a5p-1, 0x1.b564f6036ac9fp-6, 0x1.f2bdfca3e57cp-3,
+0x1.b6d28ac36da51p-3, 0x1.d2818adfa5031p-1, 0x1.cc4f424b989e8p-1, 0x1.63b671fac76cep-2,
+0x1.f7f661c3efeccp-4, 0x1.bc6f7fab78dfp-1, 0x1.1b29fb1a3653fp-1, 0x1.ddab8a23bb571p-1,
+0x1.aac24e8b5584ap-1, 0x1.d0197573a032fp-1, 0x1.78cb9982f1973p-1, 0x1.8cce198b199c3p-1,
+0x1.a8c72c03518e6p-2, 0x1.e46920cbc8d24p-1, 0x1.8ed12e931da26p-2, 0x1.a42e1573485c3p-1,
+0x1.e4b79557c96f3p-1, 0x1.8cdae6d719b5dp-1, 0x1.ff751aebfeea3p-1, 0x1.51b22782a3645p-1,
+-0x1.84e5b38309cbp-5, -0x1.eacce373d599cp-3, -0x1.25ec9b124bd94p-2, -0x1.09bc296a13786p-2,
+-0x1.78dd3482f1ba6p-2, -0x1.7ab8247af5704p-2, -0x1.cdda5f239bb4cp-2, -0x1.951eed8b2a3dep-1,
+-0x1.b50ee7036a1ddp-1, -0x1.b2840fbb65082p-2, -0x1.186f6e6230deep-1, -0x1.475a44528eb48p-1,
+-0x1.06c07d020d81p-1, -0x1.4c202c1a98406p-1, -0x1.2afe16a255fc2p-2, -0x1.8f8361931f06cp-2,
+-0x1.8fb0ac6f1f616p-1, -0x1.7a55103af4aa2p-1, -0x1.d42c4d4ba858ap-2, -0x1.e4ee5de7c9dccp-1,
+-0x1.aa3b9ac754773p-1, -0x1.714a8d26e2952p-1, -0x1.60811172c1024p-3, -0x1.abb0098b57602p-2,
+-0x1.8ce16c5f19c2ep-1, -0x1.90b7ad13216f6p-1, -0x1.31a9ef526353ep-1, -0x1.a829d7075053bp-1,
+-0x1.ee631e03dcc8p-8, -0x1.3234d46a6469ap-1, -0x1.59debe12b3bd8p-3, -0x1.c2b217838564p-5,
+-0x1.ace80d4b59d02p-1, -0x1.d2dbfa23a5b8p-2, -0x1.42126c628424ep-2, -0x1.a55a9e334ab54p-3,
+-0x1.a6ca0f4f4d942p-1, -0x1.87f665c30fecdp-1, -0x1.fe75951bfceb3p-1, -0x1.5bd8f652b7b1fp-1,
+-0x1.84e1b68309c38p-3, -0x1.16e5037a2dcap-1, -0x1.466675428cccep-2, -0x1.67f8eaa6cff1ep-1,
+-0x1.8c14be5318298p-3, -0x1.38b245f671648p-1, -0x1.7dd4db82fba98p-4, -0x1.f2b5dc07e56bcp-1,
+-0x1.660eac62cc1d6p-2, -0x1.19d0c21a33a18p-1, -0x1.d7a439efaf487p-1, -0x1.750bc3e2ea178p-3,
+-0x1.16369e822c6d4p-2, -0x1.7e23f242fc48p-4, -0x1.331af5be6635ep-1, -0x1.7fcbb9c2ff97p-5,
+-0x1.c07c2b5f80f85p-1, -0x1.9313944326274p-3, -0x1.c02692a7804d2p-1, -0x1.c458f19f88b1ep-1,
+-0x1.96f9b97f2df37p-1, -0x1.69e422c2d3c8p-5, -0x1.e084131bc1082p-1, -0x1.43e1c6c687c39p-1,
+0x1.7ff9e060fff3cp+0, 0x1.bf395b5b7e72cp+0, 0x1.2963c8d452c79p+0, 0x1.ac94d8b95929bp+0,
+0x1.fb3e2879f67c5p+0, 0x1.2a28fe485452p+0, 0x1.fea85d8ffd50cp+0, 0x1.caa1f1a79543ep+0,
+0x1.9eb67c8b3d6dp+0, 0x1.ad0ec03d5a1d8p+0, 0x1.16a57c522d4bp+0, 0x1.6d33e4beda67cp+0,
+0x1.10b59d40216b4p+0, 0x1.fec82e99fd906p+0, 0x1.73d8f6bce7b1fp+0, 0x1.b731f2296e63ep+0,
+0x1.71dfcd8ce3bfap+0, 0x1.8806d9c5100dbp+0, 0x1.889079ab1120fp+0, 0x1.2c5225ea58a45p+0,
+0x1.70249a9ee0493p+0, 0x1.ef02fecbde06p+0, 0x1.2053c81a40a79p+0, 0x1.8fe684ef1fcdp+0,
+0x1.bca08c4179412p+0, 0x1.40407ec68081p+0, 0x1.adba0c1f5b742p+0, 0x1.f123af83e2476p+0,
+0x1.34f15db069e2cp+0, 0x1.bd7802937afp+0, 0x1.4f32cc1e9e65ap+0, 0x1.b4eb3e1169d68p+0,
+0x1.7cb15decf962cp+0, 0x1.789694f2f12d2p+0, 0x1.618016c8c3003p+0, 0x1.77ef8664efdf1p+0,
+0x1.a2bf933b457f2p+0, 0x1.60287456c050ep+0, 0x1.4291780a8522fp+0, 0x1.41760fc482ec2p+0,
+0x1.0d3734941a6e7p+0, 0x1.5936f45cb26dep+0, 0x1.aea9f4855d53ep+0, 0x1.1decd1d43bd9ap+0,
+0x1.57ff22f4affe4p+0, 0x1.2282eb404505dp+0, 0x1.d51ec3fdaa3d8p+0, 0x1.c9def08193bdep+0,
+0x1.aa89c50555138p+0, 0x1.5daf3da8bb5e8p+0, 0x1.f631166dec623p+0, 0x1.1aae5fa4355ccp+0,
+0x1.4cb23c7299648p+0, 0x1.1684de862d09cp+0, 0x1.aa94e4935529cp+0, 0x1.0952c8b412a59p+0,
+0x1.56c55d4ead8acp+0, 0x1.584ef0b2b09dep+0, 0x1.fa767837f4ecfp+0, 0x1.8bb6baff176d8p+0,
+0x1.15c6f3442b8dep+0, 0x1.49a9445493528p+0, 0x1.40a1f90e8143fp+0, 0x1.9278513124f0ap+0,
+0x0p+0, /* The remaining values default to zero. */ };
+
+static const int babl_num_conversion_test_pixels = 128;
+
+static const double *babl_conversion_test_pixels = babl_path_test_pixels;
+
+static const int babl_num_format_test_pixels = 256;
+
+static const double *babl_format_test_pixels = babl_path_test_pixels;
+
+static const int babl_num_model_test_pixels = 512;
+
+static const double babl_model_test_pixels[2048] = {
+-0x1.0f8630dbb8a62p-4, 0x1.18480e35ca29bp+0, 0x1.b444a8503556p-1, 0x1.c2ddee8785bbep-1,
+0x1.261ae25d19029p+0, 0x1.80029017ccd1ep-1, 0x1.7b673ed62a01bp-2, -0x1.ce043776cf3bcp-5,
+0x1.0a554d9ee1776p-1, 0x1.37c9b5c5a2c69p-2, -0x1.9dae22833b5c8p-5, 0x1.2330732eacc75p+0,
+0x1.99315c726595ep-1, 0x1.fffac770ccc24p-4, -0x1.ab6b8d368a0a8p-6, 0x1.393ecc9c0c172p-3,
+0x1.277773ac4eeeep+0, 0x1.605f4ecac0be9p-2, 0x1.84d85897d67d8p-1, 0x1.8f8a855febe1cp-1,
+0x1.2d51d1bbf43d2p-1, 0x1.2efc2fa1912b9p+0, 0x1.2db59d7b2838p-1, 0x1.e74c8bf234ff7p-2,
+0x1.3df9bc41af26ap-1, 0x1.33c1a828cde9cp-4, 0x1.d5f2398878b14p-1, 0x1.624b94145e30cp-1,
+0x1.b0ea300295078p-1, -0x1.ce7858d069cp-8, 0x1.c6ae22838d5c4p-4, 0x1.f55fd04d84594p-1,
+-0x1.cb99d59064009p-4, 0x1.29c069865380dp+0, 0x1.51d758690a152p-1, -0x1.4e8f718f69ebcp-3,
+0x1.6d1cfcb873d38p-1, -0x1.5b6dba491d41ep-3, -0x1.43b72e9c21088p-6, 0x1.10be3f0eee49p-5,
+0x1.56dfa56de0f27p-2, 0x1.09b72b3bad07ep-3, -0x1.df3383b6f19a8p-6, -0x1.0e29ba154f86cp-4,
+0x1.d1a71446d6815p-2, 0x1.2845b77bea25p-3, 0x1.25e1c4957ef6cp-2, 0x1.a2b81620123cfp-2,
+0x1.60a77baac14eep-1, -0x1.3a74ae0f41b63p-3, -0x1.5ff57f02bfebp-7, 0x1.3c9737d5ac618p-4,
+-0x1.5c2ccab2b859ap-3, 0x1.8e9c2de5839ecp-1, 0x1.819f935a36726p-1, 0x1.4d54effb6776ap-1,
+0x1.0dbd64ab4eaep+0, 0x1.e256ccf8917a5p-2, 0x1.24e876a57d042p-3, 0x1.65fe92ed32638p-1,
+0x1.53f4dc310e5p-1, 0x1.d0ec90c06ea5fp-2, 0x1.e9eff99d6d797p-2, 0x1.80e807eb01dp-1,
+0x1.ab216a01bca93p-2, -0x1.f9711343f2e28p-5, 0x1.93aa91ed8dbb8p-1, -0x1.1dc5a568a1f1cp-4,
+-0x1.00c1960201834p-5, 0x1.eff33ee4acb34p-1, 0x1.4ee656a904332p-3, 0x1.01ca1fbd36c76p-1,
+-0x1.a02ae5c34055fp-4, 0x1.564cbfe5dfcc9p-2, 0x1.466b4ee0f33dp-1, 0x1.1b3493d1699c4p-1,
+0x1.5b9e343850d6p-1, 0x1.1fe14bcbd95c3p+0, 0x1.297b82a3ec90ap+0, 0x1.577d25dc4893ep-3,
+0x1.2bc5e93d2458ap+0, -0x1.8ef372031de7p-5, 0x1.c7b12db05c2f1p-2, -0x1.97971a799594ap-3,
+0x1.dc135d2bb826cp-1, -0x1.dc787336ec28p-10, 0x1.4dd58fc902118p-1, 0x1.9127c0165582ap-1,
+0x1.56a390a913ad8p-1, 0x1.fd7613d8c7b8ep-1, 0x1.217fd92f0fcc8p-2, 0x1.10c819ceee5cep-3,
+0x1.fe17d733fc2f8p-3, 0x1.ec1e4fcca5096p-1, 0x1.15c03a6291e6dp+0, 0x1.bb7d1139dd608p-1,
+0x1.1976d28232edap+0, 0x1.58c4a046b1894p-1, 0x1.fe2ac2f32f88ap-1, -0x1.0e136b1ee8f3bp-3,
+0x1.c4a2f17ebc791p-2, -0x1.4820dce8f6a88p-5, 0x1.24abab617c8a8p-1, 0x1.14b2826d5c984p-1,
+0x1.fa1571158dc47p-2, 0x1.2c24f59bf1e2p-7, -0x1.b3fa8169ce5b8p-4, -0x1.b7af351d08f88p-6,
+-0x1.0f99d7eeec008p-4, -0x1.27bac54582a8cp-3, 0x1.5d106c6920873p-2, -0x1.866e777ca676ap-4,
+0x1.c43efa69eee4p-8, 0x1.f8c7337324c18p-1, -0x1.8269790fd19fdp-4, 0x1.230120c646024p+0,
+0x1.2f1faecff7d8fp+0, 0x1.83eec70d6e43ep-1, 0x1.70c39b36e1872p-1, 0x1.4e7c87e29cf9p-1,
+0x1.1afe747a35fcep-1, -0x1.938b7a5ff3e3cp-3, 0x1.f914f4bcbef6cp-1, 0x1.00756856cdb7ap+0,
+0x1.eda1d79b0e76ep-1, 0x1.be2f0315e2c46p-1, 0x1.56017b7b78cfcp-1, 0x1.ba29163374522p-1,
+0x1.611a79e1289b5p-2, 0x1.db8bb00550b0fp-2, 0x1.dd0aa1d7ba154p-1, 0x1.f9451c1bf28a2p-1,
+0x1.3faa309a7f546p-1, 0x1.369fcd9a6d3f9p-2, 0x1.4f22703a9e44dp-2, -0x1.4d8bea35ce4b1p-4,
+0x1.0666e10a0ccdcp-1, 0x1.aef09cb82aae1p-2, 0x1.77bb7bb622aap-4, 0x1.4ada0c782f4dcp-1,
+0x1.e7e006e236267p-2, 0x1.43e60c11baff4p-1, 0x1.8072a3ef00e54p-1, 0x1.5ddee7d1eef1p-1,
+0x1.ac8db231bf81dp-2, 0x1.b68bdb336d17cp-1, 0x1.3d7ac2f27af58p-1, 0x1.9c3fa0a4d218dp-2,
+0x1.a82877a9b6b75p-2, 0x1.1f5fdef571f2ep-3, -0x1.272838dbe7ea2p-3, 0x1.2abc8b5abbdf8p+0,
+0x1.256dfe2f17a8cp-3, 0x1.0ad8a67615b14p+0, 0x1.effd80fcacc7cp-1, -0x1.7b4879fc902aap-4,
+0x1.6d79e9960e27p-1, 0x1.bf312c184b2f1p-2, 0x1.f1266d5a48b34p-1, -0x1.217cff95762d4p-3,
+0x1.19e26a3d66f81p+0, 0x1.67caa8c602c88p-1, 0x1.0ba6214e7db2bp+0, 0x1.0d089ea94d448p-1,
+-0x1.8d2f5b631a5ecp-3, 0x1.61dc514f90856p-3, 0x1.49bd87ce937bp-1, 0x1.0981709d4636p-1,
+0x1.9655c9165fdecp-1, 0x1.df1b5dabbe36cp-1, -0x1.20ae9568a7c3cp-5, 0x1.1efb30dbd78fcp-4,
+0x1.793606ae259f3p-2, 0x1.d4ce20fedccf6p-1, 0x1.e824b453d0496p-1, 0x1.f94842d658f6ep-1,
+0x1.24f395cbe380cp-1, 0x1.7e7221b4967ddp-2, 0x1.8406b2f3080d4p-3, 0x1.2fb71c0392a17p+0,
+0x1.6d776f03a7bbap-1, 0x1.f67813b0b9bccp-3, 0x1.2740742b1b4dbp+0, 0x1.0e9caa7aea062p+0,
+0x1.67475b62ce8e8p-4, 0x1.d81802e6e3632p-1, 0x1.2a1b560e5436ap+0, 0x1.00649db4672fap+0,
+0x1.4528ca1c23eb2p-3, 0x1.def6b3108aba2p-1, 0x1.0f6830f7b86ap+0, 0x1.ea8a095d6ead8p-5,
+0x1.c0b5ead51b057p-2, 0x1.cfb63e206c394p-1, 0x1.9217a5ab242f4p-1, 0x1.c6eb09fb8dd5fp-2,
+-0x1.f1c89fbd7d2afp-4, 0x1.d5bb1c36dea96p-3, 0x1.29aeae00b9c3cp+0, 0x1.be831b85169fcp-1,
+-0x1.1dc41b28a1eecp-5, -0x1.289f9e08b7a5cp-4, 0x1.2464740648c8fp+0, 0x1.1125280aef172p-1,
+0x1.0b1049d216209p+0, 0x1.ca8735f461db4p-1, 0x1.480e08f5c34f3p-2, 0x1.a95b86081f83dp-2,
+0x1.1acf0342359dcp-4, 0x1.6b6f179e0a116p-1, 0x1.9b6b29499d3cbp-2, 0x1.f737b5d254d5cp-1,
+0x1.27b9c17b1c405p+0, 0x1.6ba02d1e0a737p-2, 0x1.ae0aa45c28e22p-1, 0x1.5f607f692527p-5,
+0x1.3c0d984f44e7cp-4, 0x1.9bdaea126ae9p-1, -0x1.3e9c8c1c16d2cp-3, 0x1.be6497eeaffc5p-2,
+0x1.146b36b6f5a32p-1, 0x1.1ac7d2a768c2ep+0, 0x1.644152f92ee9p-1, 0x1.2d964943f4c63p+0,
+0x1.9edf7d033dbfp-1, 0x1.1fe52470a630ap-2, 0x1.b077623360eebp-2, 0x1.c70ccf778e19ap-1,
+0x1.6bc7bfac71292p-1, 0x1.8a654d5e47fddp-2, 0x1.1f298490a4b96p-1, 0x1.c051e4604d708p-1,
+0x1.068519547370ap-1, 0x1.018c0631364b4p-1, 0x1.ac4298135885p-3, 0x1.6c7e8d247296bp-2,
+0x1.96b356fcc7002p-3, 0x1.757e10e61e2f6p-1, 0x1.f1536ffcaf73ap-1, 0x1.deda391bbdb45p-2,
+0x1.ea1b0860a102ep-3, 0x1.628a78d5f8482p-3, 0x1.007cd7e867601p-2, 0x1.8e4f7a8983054p-3,
+0x1.74d91b2ae9b22p-1, -0x1.c0eab0dd1b6f1p-4, 0x1.bfe09a09e6279p-2, 0x1.01609a4d9c5adp+0,
+0x1.ca23fa5d2de18p-1, 0x1.ed5f20c8a78afp-2, 0x1.ee3468b0a9358p-3, 0x1.e0a32aa08e13p-3,
+0x1.8bb19e8e4a967p-2, 0x1.231a69c5dfce7p+0, 0x1.b3bbdb269aaacp-3, -0x1.ae1a219cf5dp-9,
+0x1.bf03fd604ad4ap-3, 0x1.ab910e49bd888p-1, 0x1.15e28dde2bc51p+0, 0x1.20f792b575226p+0,
+0x1.4ba9d24f642p-6, 0x1.c91073cd2bba7p-2, 0x1.9bdaa35f37b54p-1, 0x1.7748ce4d54f8p-1,
+0x1.263d533f19477p+0, -0x1.7dec741fc8a5cp-3, -0x1.c6f28c638de52p-4, 0x1.2f045745913bcp-3,
+0x1.7c695a44926c4p-1, 0x1.0f6dc26e1edb8p+0, 0x1.a19498c5a98f8p-1, 0x1.2eab41645d568p+0,
+0x1.117bca5bbc91p-5, -0x1.124d86c88b018p-3, 0x1.6a0febfc6db96p-3, 0x1.ec573e3ca57b4p-1,
+-0x1.64a5161c62e4p-5, 0x1.a0daae6a74e88p-1, 0x1.88b20c6bde30ep-1, 0x1.0d2007b0e70cep+0,
+0x1.891ec31645708p-4, -0x1.889cff4fde06dp-3, 0x1.60139d1c59c0cp-4, 0x1.5d630e10545fap-1,
+0x1.2539fd0f1740cp+0, 0x1.feafa1a730927p-2, 0x1.c21b5a5ab769ep-1, 0x1.4f3a4c2904daep-3,
+0x1.1209e2c55747p-3, 0x1.877a0fab0ef42p-1, 0x1.7aba90495bdb4p-4, 0x1.6a8c5b546eb25p-2,
+0x1.66f8c9693457p-7, 0x1.18cc2dea31985p+0, -0x1.cebb5376d0a9fp-4, -0x1.44fdcc28f0624p-5,
+0x1.1c41d2996bb6ep+0, -0x1.89eab29cad6f8p-6, 0x1.3baf3eea775e7p-2, 0x1.4e8699110373ap-1,
+-0x1.4f68dc929ed1cp-3, -0x1.37d1715c093c9p-4, 0x1.4576b56dbe20ap-1, 0x1.1d1f5f68a0a5p-4,
+-0x1.49ca5dcf6062p-7, 0x1.03308b699ffabp+0, -0x1.59acf10919c05p-3, 0x1.2bd3ae358ada8p-3,
+0x1.40d55ed74e778p-1, 0x1.98ad368ffe272p-1, -0x1.316b7735960cp-9, 0x1.d85f9da07d8cp-1,
+0x1.9cec5d2806a58p-1, 0x1.226edd257810ep-2, 0x1.9eb88a94d70a9p-2, 0x1.80f9f0da3527p-1,
+0x1.f6f5a5ccbab8p-1, 0x1.5889c9c9177ap-4, 0x1.1d9775283b2eep+0, -0x1.57723f6f7bb16p-4,
+0x1.0c78d7a54c24ep+0, 0x1.07f57b687651p-7, 0x1.e17c98508fc5fp-2, -0x1.1f634fd8a52d1p-3,
+-0x1.8571a54fd7b03p-4, 0x1.1d4d481fd4342p-1, 0x1.47b6b5b5c2ap-6, -0x1.7a43d77627bafp-3,
+0x1.776458f1552f2p-1, 0x1.0e7bbb89502aap-1, 0x1.565c0999dfeb4p-1, 0x1.89f08838ad7aap-1,
+0x1.4de7f3c435698p-1, 0x1.ab62c4dcf05fp-4, 0x1.09fd6d4613faep+0, 0x1.af2730b8f7e8p-1,
+-0x1.54c7b7e90ff5ep-4, 0x1.11fb025823f6p+0, 0x1.3041415660828p+0, 0x1.7ca2ce4092df2p-1,
+0x1.563cd4d446134p-1, -0x1.c553cd9d2442p-7, 0x1.dd380af55409bp-2, 0x1.1985972099718p-2,
+0x1.e1110b855bbb9p-2, 0x1.122f5895bdf85p+0, -0x1.62a6a7ef921a2p-3, 0x1.022f8a46d12bep-2,
+-0x1.6f67c0761203p-5, 0x1.2475d35d7c1eep+0, 0x1.791fc742f23f9p-2, -0x1.91accca32359ap-3,
+-0x1.95ae9c365e90cp-5, 0x1.09da4b1813b4ap+0, -0x1.177682e22eed1p-3, 0x1.c5d47fe9f20f8p-5,
+0x1.9536efc7f73abp-2, 0x1.5633dadc46014p-4, 0x1.2195c43bdcc5p-4, -0x1.2334acb5799cap-4,
+0x1.9fa89d50d8eacp-1, 0x1.e0f52887c1ea6p-1, 0x1.cbf0590864ad8p-1, 0x1.0e5455521ca8ap-2,
+-0x1.4013952280273p-3, 0x1.7984cd288ca32p-1, -0x1.80a8584fce1d9p-4, -0x1.43775df5ba224p-5,
+0x1.37146b6cd48f2p-1, -0x1.afc7761cf928ap-4, 0x1.ced1becd373dp-1, 0x1.3756ced5a1e08p-4,
+0x1.4ac1436295828p-4, 0x1.5c1d776f8507ap-3, 0x1.1a140bd1675b4p-1, 0x1.8047149b008e2p-1,
+0x1.4ffa89b5d328p-5, 0x1.27d0c83be93b2p-1, -0x1.941e32b65b6fap-3, 0x1.91be4be989e3p-3,
+0x1.0a56088ae178ep-1, 0x1.7bdd7ab491547p-2, 0x1.99ab18e00022ep-3, 0x1.576185337b8fcp-1,
+0x1.acf3b479c04dap-3, 0x1.0de717d6e89afp-2, 0x1.da25339881174p-1, 0x1.9c3ecb68d2172p-1,
+0x1.18206dad63742p-1, 0x1.325f2943318b2p+0, 0x1.de3e9c3e22e3ap-1, 0x1.458a9248f17b6p-3,
+0x1.df4d14a225008p-1, 0x1.43c88eda87912p-1, 0x1.3ef335a74ab34p-1, 0x1.f5ae95bfeb5d4p-1,
+0x1.5b9bd672b7378p-3, 0x1.75449103b755ep-1, 0x1.23eec3237b10cp+0, 0x1.f461c76fe8c3ap-1,
+0x1.a5b208a67e974p-1, 0x1.b048dea82d5e8p-1, -0x1.2c6714858c016p-3, 0x1.1ab84bbf68a3dp+0,
+-0x1.7c58a79fc57e2p-3, 0x1.3560ad1c045aep-1, 0x1.4f5145add1d5cp-1, 0x1.c4fe519d2396p-5,
+-0x1.269e22824d3dp-6, 0x1.50b01f66a1604p-1, 0x1.ce4bbcf536311p-2, 0x1.67877de2cf0eep-1,
+-0x1.5f1e2695f16f9p-3, 0x1.b3f70b1e9b214p-1, 0x1.620a72a92a7b4p-3, 0x1.e76f277d6877ep-3,
+-0x1.5bde7b0f8489ep-4, -0x1.9df4b149a24fep-4, -0x1.412f4478e8c5p-3, 0x1.530b04b1d9492p-1,
+-0x1.ab355076899dep-4, 0x1.f45931864f18cp-1, 0x1.056a07d80ad41p+0, 0x1.0826687cdd199p+0,
+0x1.a376b3e9ad53bp-2, 0x1.c6c1bdd6c0b6bp-2, 0x1.9f95004da5906p-1, 0x1.8f08b5f7eade2p-1,
+-0x1.b81ecf9d09d78p-6, 0x1.810c20289bb1cp-1, 0x1.1d0417016d3b6p-1, 0x1.fe57789596488p-1,
+0x1.95dd30d4c553fp-2, 0x1.3850b84670a16p-1, 0x1.cd61a9a867902p-1, 0x1.a47da9d1af61bp-2,
+0x1.d2bfbd9d3f18p-7, 0x1.6c9911d472cbbp-2, 0x1.54f5206ea9ea4p-1, 0x1.91f1d1398a4ap-3,
+-0x1.7da6f86c94e79p-3, -0x1.525b3c15d7e9cp-4, 0x1.19352c4bcc03fp+0, -0x1.432b8568ecbd8p-3,
+0x1.f0120a02468a8p-1, 0x1.243476af15358p-4, 0x1.1eee9de23ddd3p-2, 0x1.157e50835e2fdp+0,
+0x1.5cb97c4c530c8p-3, 0x1.4b23c87296477p-2, 0x1.17a13f522f428p-1, 0x1.105c36d553eb9p-2,
+0x1.9c257a9cd1e48p-4, 0x1.781dd12c89d53p-2, 0x1.90a42fc321484p-4, 0x1.6ba66faed74cep-1,
+0x1.02eb16f405d62p+0, 0x1.1c07f656380ffp+0, 0x1.28917e80b7895p-2, 0x1.2f3dcee8c4e2p+0,
+0x1.52b5a6690bd1ap-1, 0x1.0bd99e5417b33p+0, 0x1.f66caffb200cap-1, -0x1.23089e6246114p-3,
+0x1.d33b1d05400fdp-2, 0x1.5d67f337879cap-1, 0x1.dfc627788c591p-2, 0x1.574ef3e515044p-1,
+-0x1.4ac7a928fbf5cp-3, -0x1.0c7192087f49ap-4, 0x1.1118e74ceefeap+0, -0x1.2ed507e590dd4p-3,
+0x1.a8ccca29b8p-5, 0x1.ee35c0c576052p-1, -0x1.b0cde769c8024p-4, -0x1.6f1e3f06116fcp-3,
+-0x1.4ea85b429d50cp-3, 0x1.7f87f0d498a97p-2, 0x1.1acdbbd5cf351p+0, 0x1.a7aabaa34f556p-3,
+0x1.cbbc4309fddeep-1, 0x1.cdaca1239b593p-2, 0x1.587f3079e4318p-1, 0x1.32d3ac61ff40fp+0,
+0x1.04a5cfc73c7edp+0, 0x1.f0fa1cd8aec1p-1, 0x1.6ae7620c6f684p-1, 0x1.a8bb670a84aap-1,
+0x1.c2a3a3191ee0ep-1, 0x1.32cb43d998c9cp+0, 0x1.a0d09e75a807ap-1, 0x1.5de5c62c55651p-2,
+0x1.0b71aef7b07cfp+0, 0x1.30d6e804c8144p-1, 0x1.992e43d3325c7p-2, 0x1.34350c0c0203bp-2,
+0x1.3ec3a6af4a54p-4, 0x1.11704e0622e09p+0, 0x1.2be7f028be364p+0, 0x1.dc678790859bcp-4,
+-0x1.944ff283289ffp-3, 0x1.09cda43fad34ep+0, 0x1.58f8557c4b8a2p-3, 0x1.bdf366837be68p-5,
+0x1.9b6aa2d8d06eep-1, 0x1.0d157dbbb3c48p-2, 0x1.33f06868ce47p-4, 0x1.ae26f26e8f812p-1,
+0x1.acb51dae8c9d8p-1, -0x1.499c35b5c66cp-6, -0x1.3953155272a63p-3, 0x1.120afa522416p-1,
+0x1.42efd54a85dfap-1, 0x1.7090d18badee6p-1, 0x1.114becaa2297ep-1, 0x1.cbaa1ce530eddp-2,
+0x1.f6490ff0b95efp-2, 0x1.5cce84a920034p-5, 0x1.41507888e9074p-4, 0x1.5d871295ee416p-3,
+0x1.4fd0991c393a8p-5, 0x1.17b089f695c78p+0, 0x1.6cbb0e27a642ep-1, -0x1.d42ff756db933p-4,
+0x1.f3a32b171a797p-2, -0x1.68a1b2d60476bp-4, 0x1.8bf5db0e4b1edp-2, 0x1.881070c7dcedap-1,
+0x1.2e19660bf5cc6p+0, 0x1.6ec8ced943f7fp-2, 0x1.1501e4102a03cp+0, 0x1.2ec29aeec3eb9p+0,
+0x1.9265261657fd8p-3, 0x1.9db77190083b8p-5, 0x1.2fe05d9bf95ap-5, -0x1.9989e83666471p-3,
+0x1.06cc9c5d40cc6p-1, 0x1.3fc4f2a5b2bd1p-2, 0x1.ae2adeccf5ef4p-1, 0x1.346d4e7f35a76p-3,
+0x1.f7f7fc1723231p-2, 0x1.c63c7fdebfac4p-1, 0x1.c58cb45857e64p-1, -0x1.3bd498af44761p-4,
+0x1.a0cdd6080e687p-2, 0x1.c1c8ea70505e8p-3, 0x1.24c0e1c3164e8p-1, 0x1.18f8ecb165251p+0,
+0x1.d94b129a18fc7p-2, 0x1.b3515740336f8p-1, 0x1.1769bd0efba04p-4, 0x1.6808f94ad011ep-1,
+0x1.7c4c04c15efe6p-1, 0x1.f60eac2fec1d6p-1, 0x1.93e960c65b05ep-1, 0x1.f6e67c1d8766p-6,
+0x1.17b06e1dc8fa7p+0, -0x1.904303cfed538p-6, 0x1.fe2e0b0f2f8f4p-1, 0x1.1296a0f3bec6ep+0,
+0x1.1148b5ba22916p-1, 0x1.c1cb6cc91d306p-1, 0x1.0e2608ac82b27p+0, 0x1.dc4865a61ef72p-1,
+0x1.2106a524420d5p+0, -0x1.b8e279c9d82b7p-4, 0x1.dc4c51feebcbep-1, 0x1.c4e7007389cdfp-2,
+0x1.9e592100097efp-2, 0x1.2410ca5fe1bb2p-1, 0x1.95f53a3ff8b74p-1, 0x1.18c77a78fe5bcp+0,
+0x1.07cdc7b07601fp-2, 0x1.ea371063d46e1p-2, -0x1.7148122948f69p-3, 0x1.bab43542a89bap-1,
+0x1.cbf4293464b52p-1, 0x1.2ed5439f2a774p-1, 0x1.863fa83972e5ap-1, 0x1.48cd3055c4cd8p-3,
+0x1.ef00d1cd779b4p-3, 0x1.07c9a320dc601p+0, 0x1.105155e353d5ep+0, 0x1.2f394fd05e72ap+0,
+0x1.9f3b8c05a4dd8p-1, 0x1.4e25a6269c4b4p-1, 0x1.f0db456a481dp-7, 0x1.683601d536d26p-1,
+0x1.a809f46e83472p-1, -0x1.81d3b90636dabp-3, 0x1.26fcdd50b4602p-1, 0x1.4bb10ef297622p-3,
+0x1.c7bce4edf5e02p-1, 0x1.b9c5107b738a1p-2, -0x1.b98de849d9824p-4, 0x1.a363c8ca79facp-1,
+0x1.0c2c9f707ebfap-1, 0x1.05c07db0d84ddp+0, 0x1.f70e2983ee1cp-5, 0x1.20dfcb2b74f2dp+0,
+0x1.9256beab24ad7p-2, 0x1.0de6419f4effbp+0, 0x1.06741271401b5p+0, 0x1.b378a99433be2p-1,
+0x1.55034a09106cfp-2, 0x1.0b7e435f4a2fbp+0, 0x1.07c6786adc59ap-1, 0x1.00f67cceceb98p-5,
+0x1.bed6c7e37dad9p-2, 0x1.3cfdd1ef46c84p-4, 0x1.9152349cbc3dfp-2, 0x1.c191fed11cbdap-1,
+-0x1.799b2f62f3367p-4, 0x1.05cabf520b958p-2, 0x1.b99e3805d9a2ep-1, 0x1.d66e8c854676cp-1,
+0x1.1bb8b61b043e4p+0, 0x1.13e405c0f494dp+0, 0x1.b07c4fdcfa923p-2, 0x1.7914fa3e255d2p-1,
+0x1.16dcc1d360ecbp+0, 0x1.32d0b5d598d4ap+0, 0x1.1933d23098cep+0, 0x1.8f100228b7b98p-1,
+0x1.b83b1af9d6dc9p-2, 0x1.30ce26e1fb35ep+0, 0x1.981ac90e6368bp-2, 0x1.275849a9e84a3p+0,
+0x1.035b715cd383bp+0, 0x1.51e4ad85d6fc8p-1, 0x1.1504e1a22a09cp+0, 0x1.a5ef6e8ce5788p-3,
+0x1.074aca5e0e958p-1, 0x1.d08b81bad44a4p-1, -0x1.25c784bbe528ap-3, 0x1.0c196ae47e994p+0,
+0x1.8121a20d68a9ap-1, 0x1.24bafda24976p-1, -0x1.f1214683e242ap-4, -0x1.76581b361fe4p-7,
+0x1.b2c11e4698b56p-1, 0x1.e1d6afc8907a3p-2, 0x1.110f826555523p+0, 0x1.e9f41ec63a4eap-1,
+0x1.da371df3b46e4p-1, 0x1.7556d66484474p-1, 0x1.59fc44df80c54p-1, 0x1.ab4223c356844p-1,
+0x1.36b87b80070a8p-1, -0x1.a15fccf00f8c7p-4, 0x1.7be16f2af7c2dp-2, 0x1.fc17317591c7fp-2,
+-0x1.a787a2f682428p-4, 0x1.13e3eb155afbp-2, 0x1.35a9a3e8d1b98p-4, 0x1.0d92ff8a1b26p-1,
+0x1.0a4fb9c547d2ap-2, 0x1.5928ff6ab252p-1, 0x1.ebba58e3d7749p-2, 0x1.2bc2c98257858p-4,
+0x1.129d1a288ba08p-3, 0x1.730112947f9bbp-2, 0x1.eab5367f089d9p-2, 0x1.b258774e97e42p-1,
+0x1.1d2d24c8a0c08p-4, 0x1.124f2076f16bp-1, 0x1.6424e6ab95168p-1, 0x1.0596d68671941p+0,
+-0x1.7ae2429628f7cp-4, 0x1.8c6724417f34ap-1, -0x1.844867196ef74p-3, 0x1.e9cb3c5fd3966p-1,
+0x1.6ec15b9c771c4p-5, 0x1.13b9a8b55aa68p+0, 0x1.6d58f4ba0de52p-1, 0x1.2bc4cd0cbdfp+0,
+0x1.3663c168d32dep-1, 0x1.83bb4cb63aa9cp-3, 0x1.9c655770d2644p-1, 0x1.ad759f368e1ep-7,
+0x1.26527febe63e8p-2, -0x1.820aecb63749p-6, 0x1.6b27d59e0982cp-1, 0x1.893d640645adfp-2,
+0x1.c8900916c4533p-2, 0x1.f84370818a208p-1, 0x1.1c4c0bf9d231bp+0, 0x1.cfd647da0613p-1,
+0x1.d60c130bac181p-2, 0x1.901dbbf3203b7p-2, 0x1.2dda83b85bb51p+0, 0x1.9613b6765f5aap-1,
+0x1.e7f5cdafcfeb8p-1, 0x1.d55278887771bp-2, 0x1.c40b8eb1ee7d7p-2, -0x1.6b2bd08c6ff14p-3,
+0x1.31af6190c9c52p+0, -0x1.01ddc33b9d554p-4, 0x1.0b648faae395ep+0, -0x1.931f5cbcbfd86p-4,
+0x1.d291d2460b8ap-1, 0x1.0e0eb5fae8ea3p+0, 0x1.0ee6db975100ep+0, 0x1.27f227331cb12p+0,
+0x1.dd2a56f487216p-1, 0x1.24c0457cafe6ep-1, 0x1.2083c109daa11p+0, 0x1.5a4f63e2b49ebp-2,
+0x1.ec157f10a4f7cp-1, 0x1.7706731887a66p-1, 0x1.1a43eed49aee4p-1, 0x1.8d8589a981718p-5,
+0x1.d15c82193c52ap-1, 0x1.f055e0c3e0ab8p-5, 0x1.43dd710421546p-1, 0x1.3cf880f8e0574p-3,
+-0x1.3c765f78df533p-3, 0x1.160f228bc5b7cp-1, -0x1.1d47f94f075ccp-3, 0x1.024ed80e049dap-1,
+0x1.22423378aaeadp+0, -0x1.480d753c29b49p-3, 0x1.8fe140c31fc24p-4, 0x1.c613ce3525c14p-1,
+0x1.fe188ac262977p-2, 0x1.7a6855d7c19d6p-1, 0x1.d1af4078702b4p-1, 0x1.f809442d89ac1p-2,
+0x1.c09303dc4df2ep-1, 0x1.8211f96237572p-1, 0x1.30071ce593416p-1, 0x1.2cbe6fb6597cep-1,
+0x1.37c8feec092bap-1, 0x1.cedcdb506a867p-2, 0x1.163c57b092df2p-1, 0x1.5d19def453cd3p-2,
+-0x1.68decd1c6b574p-3, 0x1.e1bae6bbc375dp-2, 0x1.c21b07d1ea9c8p-1, 0x1.f844322ff0886p-1,
+0x1.7d800a696164p-9, 0x1.d7e241007c914p-3, -0x1.55276e6f771bbp-3, 0x1.1ca03447d2dap+0,
+0x1.f6c8a965872adp-2, 0x1.54f9fbcea9f4p-1, 0x1.10c1130eee4ecp-4, 0x1.12ad233af227p-1,
+0x1.28adfd02515bp-7, 0x1.04b229d209644p-3, -0x1.45a9ac75be869p-3, -0x1.d3f4786a0e4f8p-5,
+0x1.563e4e2f79496p-3, 0x1.1be08d856af44p-3, 0x1.079d768a75a15p+0, 0x1.bb023f5376048p-1,
+0x1.13e36fd28e2d4p+0, 0x1.7a83c7215b6dep-1, 0x1.4281ec0f51d08p-3, 0x1.81f37d156a4d6p-1,
+0x1.2c5eb43a58bd6p-2, 0x1.e70dfe4fce1cp-1, 0x1.212e197f0f29p-3, 0x1.1a2f5fb7cdf86p+0,
+0x1.a058164673e34p-3, 0x1.c4ee4476bd0fcp-1, 0x1.f21521f7175d6p-3, 0x1.d112e2c3a225cp-3,
+0x1.3d9545a27b2a8p-3, -0x1.3e30b0b5af94bp-4, 0x1.88a11e9caadbp-7, 0x1.6e926fbe10581p-2,
+0x1.6931c11f9f305p-2, 0x1.73f0f44fb4ae8p-5, 0x1.144674055bc01p-2, 0x1.0b31cdd47ccap+0,
+0x1.d29f717a0ba54p-1, 0x1.12a1c2caf2104p-1, 0x1.8554b0efd7761p-2, 0x1.1ed447ea3da89p+0,
+0x1.ba34b3a5dacfcp-1, 0x1.af4ca781c4ff9p-2, -0x1.17f47878964f6p-3, -0x1.5a887ce91b776p-3,
+0x1.8504dd8e3d3cep-1, 0x1.17d21aae960a9p+0, 0x1.cac686852f26ap-1, 0x1.466556c759976p-1,
+0x1.43c19618211ccp-1, -0x1.2bfd938bf194cp-3, 0x1.87c9b5c30f936p-3, 0x1.202bab4dd9f0fp+0,
+0x1.013a7fe99c0eap+0, 0x1.10a45a36ee156p-1, 0x1.0727d7cfa7e94p+0, 0x1.0927be354582p-7,
+0x1.bcb0e106ac94ep-3, 0x1.23748db57a1c4p-4, 0x1.bd9f7c2b7b3efp-2, 0x1.24f7f01649efep-1,
+0x1.8c3b88197edd6p-3, 0x1.4b58a8f696b16p-1, 0x1.2153c72ddc412p+0, 0x1.7e0e28fc95b5ep-1,
+0x1.c8fe1ea1f862ap-1, 0x1.999187c999896p-3, 0x1.2e0b5e398f4ap-1, 0x1.353729b00407ep-1,
+0x1.df6c8b23bed92p-1, 0x1.2b8e0e8bf0b5cp+0, 0x1.0c79531e18f2ap-1, 0x1.333ad85d99a8ep-1,
+0x1.90b814e4bb09bp-2, 0x1.2ce29b6659c52p-1, 0x1.42ff1f89b9318p-1, -0x1.9057e6b653e34p-5,
+0x1.ec40d4ba3ee7fp-2, 0x1.4ebe7f45d0b03p-2, 0x1.93c63ec25abfap-1, -0x1.64232fb5fb79bp-4,
+0x1.858c824ca4b29p-2, 0x1.2e0f894cc2857p+0, -0x1.4a4dd71c2e355p-3, 0x1.7b536a4c90406p-3,
+0x1.065d066473206p-1, 0x1.1111501f5555dp+0, 0x1.92bfbfe4bf191p-2, 0x1.dbefa50c84acp-1,
+-0x1.fd53476a610d4p-5, 0x1.074b023741c94p+0, 0x1.35025d6d9d37fp-2, 0x1.534027ec4019dp-2,
+0x1.e7108df234877p-2, 0x1.db095a9a1c792p-3, -0x1.f5c14bca51e91p-4, 0x1.587ffcbc4a998p-3,
+0x1.438d1eff53e7p-1, 0x1.55b99b26ab734p-1, 0x1.f1bd8f4b16ae4p-1, 0x1.7926876e25803p-2,
+0x1.466f51d826782p-1, 0x1.2fa0f7fa5f41fp-2, 0x1.2b1a413d8967bp+0, -0x1.5e6c2885f00b9p-3,
+0x1.158cbee4f7e65p+0, 0x1.32cd3b9e659a6p-1, -0x1.474444cf5b558p-6, 0x1.75a703761e813p-2,
+0x1.204970d3da2c7p+0, 0x1.eff28302464b8p-1, 0x1.e96b04556c6f9p-2, 0x1.39e578cf4097bp-2,
+0x1.e5ab2f2fcb566p-1, 0x1.088872ca1110ep-1, 0x1.622dfd612ac26p-1, 0x1.0b439e507cedap-2,
+0x1.88895944aaac3p-2, -0x1.d6c448c3ad88ap-4, -0x1.353c8dcf3747p-7, 0x1.0ad5de9215abcp-1,
+0x1.1d11f0e106f0bp+0, 0x1.f82545d7237dbp-2, 0x1.0d6e2c7a1adc5p+0, 0x1.8e8b849e504a3p-2,
+0x1.d93b5ff87f438p-1, 0x1.21454af0a8f1p+0, 0x1.83cc27ea3acb8p-1, 0x1.6cc43122d9885p-2,
+0x1.31ddcaa196eecp-1, 0x1.0f2350c95179ep-1, 0x1.d95bc2aee5eaap-1, 0x1.1e6b60dbd6704p-5,
+0x1.06ad199673c09p+0, 0x1.c929dec39253cp-1, 0x1.059092953e544p-4, 0x1.d20d4a8ad74dcp-1,
+0x1.2b2167ebefdc5p-2, 0x1.f3795a4a4d59p-3, 0x1.33d32efc013fcp-4, 0x1.bef4bcc6b11cap-3,
+0x1.9a9cca36686cp-7, 0x1.81964e709cc62p-1, 0x1.731651ffb2f96p-1, 0x1.293e045f85af4p+0,
+0x1.1dc2d6a23b858p-4, 0x1.bb77a3d376ef2p-3, 0x1.c6ddc5ed2755p-3, 0x1.4e636ddd032d4p-1,
+0x1.34d78c90d0157p-2, 0x1.a691cb54e6bd3p-2, -0x1.a5a33f9ce4e08p-6, 0x1.b8a50679d7b06p-3,
+0x1.1ae0f77e35c1fp+0, -0x1.62dc9dd2c5b94p-3, 0x1.9bd56a540477ap-1, 0x1.a896e88e8461p-1,
+0x1.281cea6c5039dp+0, 0x1.727657a47e863p-2, -0x1.db595303b6b4p-7, 0x1.1bb1390e37626p-1,
+0x1.17627180fb91bp+0, 0x1.1c2a61e49ebb2p+0, 0x1.93fe55825b2fcp-1, 0x1.d5b8afc2dea4ap-1,
+0x1.9b183c20cfcap-1, 0x1.0d8b671db4b07p+0, 0x1.415f93e74f8bep-1, -0x1.adebb2a9c23dep-4,
+0x1.8c75f30fe5b88p-4, 0x1.ce40602d361a6p-1, 0x1.40cc3e90e7fedp-2, 0x1.3cbf2fe2797e5p-2,
+0x1.d2e09063a5c11p-2, -0x1.4ba7d48f641c8p-3, 0x1.14ea7488903b4p-2, 0x1.738f096c80b7ap-1,
+0x1.04b4b47a09695p-2, 0x1.62931225f8596p-1, 0x1.6e3043760f93cp-3, 0x1.832c86ebd325ep-1,
+-0x1.845374dca240ap-4, 0x1.698aba99397bdp-2, 0x1.2bde177857bc3p+0, -0x1.84bb98163caa7p-3,
+0x1.84e9387ca36c1p-2, 0x1.8d2b32d8b3fp-1, 0x1.adce68ef5b9ccp-1, 0x1.58901555e4535p-2,
+-0x1.00003ddb999a2p-4, 0x1.0663b504d9943p+0, 0x1.172fd50fc7f94p+0, -0x1.5e862c95f03f9p-3,
+0x1.deb5c766f09ecp-1, 0x1.5bf79935eb226p-1, 0x1.e47d8b096294ap-1, 0x1.13679d215a026p-1,
+0x1.10a8010554832p-1, 0x1.7eed710964415p-2, 0x1.44108d328821p-1, 0x1.a89d25cdb7a0cp-1,
+0x1.3a85922f41d7cp-4, 0x1.256e8970b1438p+0, -0x1.f69a8ad0ba02p-5, 0x1.772760de2181ep-1,
+0x1.2f2cc214c4bfep+0, 0x1.a2e3effb45c7dp-2, 0x1.08a007c877a67p-2, 0x1.e935dfea38d22p-3,
+-0x1.930ae2432615dp-4, 0x1.46427b28261eap-1, 0x1.31f032a663e06p+0, 0x1.bd4dc4037a9ap-8,
+0x1.30b71f6d94a17p+0, 0x1.2a9b16e8bb9c9p+0, 0x1.16437d1bc62p-6, 0x1.7af8e9662924fp-2,
+0x1.7bfafa3e2b292p-1, 0x1.0e73759f501a2p+0, 0x1.d02ae5c46d22ap-1, 0x1.c26158e91e5c4p-1,
+0x1.c347eedc535cap-1, 0x1.9824297d96aecp-1, 0x1.d126342fa24c6p-1, 0x1.3b974fd743fb6p-1,
+0x1.1b6ab88f03a23p-2, 0x1.4f3d58cd04e1p-1, -0x1.767797362022cp-5, 0x1.0261e1dc6b2a2p+0,
+-0x1.5ec9546923f91p-3, 0x1.930f7a2b261eep-1, 0x1.46fa831a8df5p-1, 0x1.b0261c902d18cp-4,
+0x1.778626a088a5ep-1, 0x1.8df740d98254ep-1, 0x1.09c9456b46c5bp+0, 0x1.6f79445e1225ap-1,
+-0x1.bf4b6536b1cbp-7, 0x1.8be142764af5cp-4, 0x1.2816915f83605p+0, 0x1.683ee47603b0cp-4,
+0x1.de2509e2ef7d4p-1, 0x1.26d390cfe740cp+0, 0x1.2dd1bcfa5ba37p-2, 0x1.d92ce25218c02p-1,
+0x1.1e3b7482a2dd5p+0, 0x1.060160cc72692p-1, 0x1.821784c96a954p-4, 0x1.520b7cdd0a7d6p-1,
+0x1.7903cb3e253abp-2, -0x1.97e240232fc48p-3, 0x1.5c0cdeb451b35p-2, 0x1.9636e0f65fa0cp-5,
+0x1.9891ffdb3123ep-1, 0x1.8c63d1dcb261p-5, 0x1.bb61244d105bep-1, -0x1.007c2925342b9p-3,
+0x1.ce69fc51366dap-1, 0x1.053008a2d72cep+0, 0x1.15858feaf7d7ep+0, 0x1.dd1e0d9d53d5cp-1,
+0x1.37092504d478cp-1, 0x1.0b9f3c8a173e6p-1, -0x1.4d0e54f29a1cbp-3, 0x1.20a394e5747a6p-3,
+0x1.9980b7bccc9acp-4, 0x1.135aae02f3822p+0, 0x1.0f044801b7a22p+0, 0x1.25329f924a653p-2,
+-0x1.c69c42e9f39f8p-6, 0x1.03e7a62b3b028p+0, 0x1.260792be4c0f2p-1, 0x1.1b2b471903235p+0,
+0x1.ef10078fde2p-1, 0x1.11ab6bd0f023ap+0, 0x1.a91d0a1db8a08p-1, 0x1.c5208a2923daap-1,
+0x1.85e3a404a560dp-2, 0x1.1fe3308ea62ccp+0, 0x1.618b41345cb01p-2, 0x1.e5da1e07cbb44p-1,
+0x1.201a1bbd73677p+0, 0x1.c53276605731cp-1, 0x1.32d1f93ecc0a5p+0, 0x1.725fd0ea17f2cp-1,
+0x1.222f8cf2445f2p+0, 0x1.ba9eb064420a2p-1, 0x1.98a72d0ccae7ep-1, 0x1.ac62afcf58c56p-1,
+0x1.5e985b3df063ep-1, 0x1.5d4be676ba97cp-1, 0x1.231a5700ac9bp-1, 0x1.79d8ceb626e4cp-4,
+0x1.425e4a68eb2p-8, 0x1.363d28300613ep-1, 0x1.bb94caed10c31p-2, 0x1.383673e5a3a01p-2,
+0x1.ed183b93da307p-2, 0x1.2ad91e1bef4bdp-2, 0x1.951af027f702ap-1, 0x1.4ebda21903e1ap-1,
+0x1.b6aba7f03a24p-4, 0x1.52f071e90c474p-3, 0x1.1eadc9e4a3c1ep-1, -0x1.0203a7786a6dcp-3,
+0x1.1ac8db5bcf2b4p-5, 0x1.8591b6597189cp-3, 0x1.eb0606b16fa5ap-1, 0x1.3b04c61e76098p-1,
+0x1.d623423d45ep-4, 0x1.ab2a0729bcba4p-4, 0x1.74f0fb7fb6aebp-2, 0x1.492395c29246cp-5,
+0x1.307f0ed5fa97bp+0, 0x1.736c13a2e6d81p-2, 0x1.ed5870aca77dap-1, 0x1.1f7b68923ef6dp+0,
+0x1.bdca7936aec78p-6, 0x1.1f99374d7265ap-1, 0x1.84f31a87d6b3p-1, 0x1.d2ed156e0c408p-1,
+0x1.67eb75dc69704p-5, 0x1.069c2c88739eap-3, -0x1.90f8dc9cbb8b6p-3, 0x1.fda76963fb4eap-3,
+0x1.de4a99b88962p-1, 0x1.bfe52976b2fd7p-2, 0x1.81eb7ab7d0a3cp-1, 0x1.b9c14459d9e8cp-3,
+0x1.dbc58a2fb78bp-1, 0x1.614008e78f4cdp-2, 0x1.11ca2ccaf0613p+0, -0x1.4f2d9cf904c1ap-3,
+0x1.6bc28754711eap-1, 0x1.b7b77a1d09087p-2, -0x1.6f2f55afab2b9p-4, 0x1.e3d57b709477cp-1,
+0x1.a3a6910b474d2p-1, 0x1.11c34133bd201p+0, 0x1.70e7b6514835dp-2, 0x1.2268afdf78049p+0,
+-0x1.af5463e9c50f8p-6, 0x1.d952bf4ee5d8ap-1, -0x1.a059aa1cda4d8p-6, -0x1.2e2ebdf58f91p-5,
+0x1.651315a2ca26p-4, 0x1.235e04e11388dp+0, -0x1.d2940936d85b5p-4, 0x1.41ee39d41d75fp-2,
+0x1.ffddb5526621bp-2, 0x1.b106ffccfba7ap-1, 0x1.afb97d835f728p-6, 0x1.7cd3f86d600e4p-1,
+0x1.2c8a38aabf7adp+0, 0x1.f4bf661d83178p-6, 0x1.31521c9662a43p+0, 0x1.d0f8a4a20857ap-1,
+0x1.55fef652abfdep-1, 0x1.7e294d7895ec2p-1, -0x1.37eb859c0970bp-4, 0x1.96bc342cc711fp-2,
+-0x1.bce8a3fd136afp-4, 0x1.317ea7a462fd5p+0, 0x1.bbf2328844b11p-2, 0x1.9a8bd940ceb16p-1,
+0x1.b0e54be1c830fp-2, 0x1.167994f493598p-1, 0x1.17faee456329p-1, 0x1.5b2d0902b659cp-5,
+0x1.a73361e01b337p-2, 0x1.1b6a97ea36d53p+0, -0x1.7c46c39c92278p-6, 0x1.2c85743725d7ap-1,
+0x1.a9c188b75383p-1, 0x1.36058be26c0bp-3, 0x1.8008eebe3345p-1, 0x1.1e6528ebd663fp+0,
+0x1.6eb832a2dd704p-4, 0x1.ac1cd4035839ap-1, 0x1.dd6c2156ee0b6p-3, 0x1.942c4763f5256p-1,
+0x1.ed7adac8a7c27p-2, 0x1.d67e755079c99p-2, 0x1.5533b2caaa675p-2, 0x1.d2d6f09ba5addp-2,
+0x1.614b9c3f8f64p-1, 0x1.4daf584c34f83p-2, 0x1.4ff6da0f6cba6p-3, 0x1.4390b098ed87cp-3,
+-0x1.0595b31ed7f84p-3, 0x1.26cd586d80cddp-2, 0x1.82a8aca89eeaep-1, -0x1.29c1ae0f20504p-5,
+0x1.1ffb2a270cc31p-2, -0x1.71281fcfaf1ep-7, 0x1.ee5624c64312ap-1, 0x1.ced6a16ad0e06p-1,
+0x1.771b5adbbb038p-1, 0x1.3fd5594a7faabp-2, 0x1.2577ec337e231p+0, -0x1.bb15a9a9dc92p-5,
+0x1.c165d836b5fecp-3, -0x1.3ac6210f42592p-4, 0x1.773a8002ee75p-1, -0x1.312d9e85958e8p-3,
+0x1.191e0a85656f4p-2, 0x1.21ba10b576a74p-2, 0x1.2b72a84e56e55p+0, 0x1.20cc71fd74cc2p-1,
+-0x1.4b64506f63958p-4, 0x1.9f67ca19a535ep-3, 0x1.3a494bd5a7c5cp-3, 0x1.33b749bccdd4ep-1,
+0x1.b97f93950c98cp-1, 0x1.5f9292c1258b8p-1, -0x1.250e91857d506p-3, 0x1.68c992dc6b2cbp-2,
+-0x1.7ff09e12ffe14p-3, 0x1.c481e2238903cp-3, 0x1.6baf5bfad75eap-1, -0x1.d7d96f307c7fcp-4,
+0x1.6aed8b26090e4p-1, 0x1.0fe3446eec934p-2, 0x1.8cf1da4fe6b08p-5, 0x1.30a8c34ffaeb2p+0,
+0x1.d126d03d3be73p-2, -0x1.7d049002fa092p-3, 0x1.c9c1c1a460504p-1, -0x1.ade8db035bd3p-7,
+0x1.4e1fde15cf72dp-2, 0x1.ae4b339f5c966p-1, 0x1.0ff5a17eecb8p-3, 0x1.7dcfcb8495392p-1,
+0x1.ed58d5e3dab1ap-1, 0x1.10cf27648804bp+0, 0x1.97eaca49963bep-1, 0x1.38174ba8d694cp-5,
+0x1.3053c2df2d744p-3, 0x1.8869b47a44068p-1, 0x1.9ab44d1e689bcp-1, 0x1.121d9a208aa19p-2,
+0x1.2b5506b389dd4p+0, 0x1.27d6833d1c79dp+0, 0x1.11963e99bcc62p+0, 0x1.a9c33a9020534p-1,
+0x1.48d932cf5e7f2p-1, 0x1.20279f9c404f4p+0, -0x1.07cc4db542ccp-6, 0x1.4f4371b69e86ep-1,
+0x1.2c2545558b7dcp-3, 0x1.c9d75ff92d486p-1, 0x1.7aaeaa36f55d6p-1, 0x1.0e2ea170e92a1p+0,
+-0x1.49d643b5c6dfcp-5, 0x1.f9e42e425a2ecp-1, 0x1.0ba4318db0e2p+0, 0x1.3a5c6a4f4185ap-1,
+0x1.0084b856cdd64p+0, 0x1.7aa3be53c2144p-1, 0x1.9a0b2d499a7ccp-1, 0x1.06cbe5320d97cp-3,
+0x1.8511170e3d555p-2, 0x1.22377e07de089p+0, 0x1.12f4959bbf82cp+0, 0x1.25ebebfbe5716p-3,
+0x1.ffa6e46ccc1aap-1, 0x1.576d8f1515418p-1, 0x1.86c5ac4b0d8b5p-2, -0x1.aaa9141ceeecp-5,
+0x1.e5c3748d65208p-3, -0x1.09e8650213d1p-6, 0x1.a9954469b990fp-2, 0x1.a6d21079b40a8p-3,
+-0x1.f08a3143e1148p-5, 0x1.23217203dfdc7p-2, -0x1.4bba9edf64421p-3, 0x1.9036f62186d44p-1,
+0x1.ade64739c232ep-3, 0x1.672b881c67fp-6, 0x1.e45005b0956ccp-3, 0x1.1ce9498fd36c2p-1,
+0x1.1dbb91503b772p+0, 0x1.2d1489078d5c4p+0, 0x1.a5c04c0b4b809p-2, -0x1.fc65400a5f30fp-4,
+0x1.eda6d9e574e74p-1, 0x1.0784456a0f088p-2, 0x1.613628b45c05ep-1, 0x1.8849e4271093cp-1,
+0x1.326623b797ff8p+0, 0x1.29b5df23ed055p-2, 0x1.1831a1efc9fcep+0, 0x1.81dcd9149d535p-2,
+0x1.cb8e14d6ca4f4p-3, 0x1.efe608ab12ff4p-1, 0x1.70cfcdf54806p-1, 0x1.848066cfd5cdp-6,
+0x1.c1da62b383b4bp-2, -0x1.919e128989a2ap-4, 0x1.5f7f616c58984p-3, 0x1.c0c474e38188ep-1,
+0x1.5f1b0769249c4p-4, 0x1.9310e0fbf2ee8p-1, -0x1.df6b6b23bed6fp-4, 0x1.cd0490fd33a2ap-3,
+-0x1.071331b8748cdp-3, -0x1.43ad75af5427dp-4, -0x1.8bb930164aa5ap-3, 0x1.2036578d739fdp-2,
+0x1.24a84fc57c83cp-3, 0x1.f2306f33e460cp-3, 0x1.09b56dde79d14p+0, 0x1.e3ad02b6fa8dp-5,
+0x1.c13b1dc04f43p-3, 0x1.ff926d70cbf18p-3, 0x1.14523a4228a46p-3, -0x1.0e18a21bb5cb8p-6,
+0x1.6a0d2477a0e7p-1, 0x1.06588ed5a64abp+0, 0x1.e63f857c994bcp-1, 0x1.687305806a7fap-1,
+0x1.d92d368a18c0cp-4, 0x1.b03c62f02d45ap-1, -0x1.e827a30a36b5cp-4, 0x1.146f926d5c126p-1,
+0x1.39bc0534d9de6p-1, 0x1.9a313ffa6795cp-1, 0x1.86f9fc0a41272p-1, -0x1.2ef4bf75911ccp-3,
+0x1.ce63e40f9cc7cp-1, 0x1.22a01d68aba6ap+0, 0x1.db6dab6c83a82p-1, 0x1.3056d5b460adap+0,
+0x1.71eab5614a3bcp-1, 0x1.02f352373919ep+0, 0x1.b621a4f0391p-3, 0x1.968c4f59937fp-1,
+0x1.21ebae0f770a9p+0, 0x1.c4020e738804p-3, -0x1.fdf75a5d95886p-4, 0x1.34d84d4f367d4p-4,
+0x1.53f305d5db192p-1, 0x1.1d092b6ea078cp+0, 0x1.5678807779bdbp-2, 0x1.155419d62aa83p+0,
+0x1.4e422f35cfb7ap-3, 0x1.56b73532ad6e6p-1, -0x1.10bbdf422177cp-3, 0x1.12020b55bd9dbp+0,
+0x1.fa03d8e3f4079p-2, 0x1.043b7a0c0876fp+0, 0x1.2610b5bfe5bbp-1, 0x1.9e8df9a9a3826p-1,
+0x1.524cf09c3e338p-1, 0x1.4f7227ca9ee44p-1, 0x1.325c96abfe52cp-3, 0x1.2d147b28c08f4p-4,
+0x1.067a02b20cf4p-2, 0x1.1cfbc40dd3912p+0, 0x1.012f17b868c48p-3, -0x1.4c580fdc3249cp-5,
+0x1.0c68ae407f37cp+0, -0x1.2ab3d42f22348p-3, -0x1.a7e3c0101c948p-5, 0x1.2455ab7648ab6p-1,
+0x1.10d00ae488068p+0, 0x1.72e12742e5c25p-2, 0x1.51ee518f70a96p-3, 0x1.ff110b8197bbap-1,
+0x1.90d77daa54e22p-1, 0x1.ec8c3e10a5e54p-3, -0x1.02e9450205d29p-3, 0x1.f9907450bfedap-3,
+0x1.3b3bffd5a9ab2p-3, 0x1.a1d0aac343a15p-2, 0x1.0a97a952152f4p-3, 0x1.08c5f22944bf2p-1,
+-0x1.f636debd86077p-4, 0x1.937563bff3b78p-3, 0x1.8cc744d17ff4fp-2, 0x1.24a17700afa94p-1,
+0x1.bb79a70376f2p-7, 0x1.296d5f4a52dacp+0, 0x1.732428f94caeap-3, 0x1.bfa13d9eb275ap-1,
+0x1.3be67ff34499cp-1, 0x1.0fc6964fb926cp-1, 0x1.25d519b7e543dp+0, 0x1.12c4f3d958bd2p+0,
+0x1.c6af6ffec0921p-2, 0x1.2c7c978f25c5cp-4, -0x1.5687fedc46a9ap-3, 0x1.2b855c33f0a44p-2,
+0x1.052411320a48p-3, -0x1.373aaa35a1a9p-6, 0x1.103f5ffb53b1fp+0, -0x1.bea62869e3b4p-8,
+0x1.161d24bbc5d3ep-1, 0x1.d27dbe83a4fbp-6, 0x1.30fd12cb952d5p+0, 0x1.0238efe86ad84p-3,
+0x1.e03ac7bd5a0f1p-2, -0x1.149a48555c67cp-3, 0x1.2558bf74b117ep-1, 0x1.a552ca3a7dd8cp-1,
+0x1.e4505365623a3p-2, 0x1.ce65102f9cca2p-1, 0x1.1ec957df0a5f6p-3, 0x1.19c7b44166c28p-1,
+-0x1.991fea63323fep-4, 0x1.747c5ec6e8f8ap-1, -0x1.3fe9d94f4ca0ap-4, 0x1.d1827db06fd1cp-4,
+0x1.60f0b6ef8eae2p-1, 0x1.36646af59ffc1p-2, 0x1.301bf9e06037fp+0, 0x1.b38683b69a4p-4,
+0x1.08af991877c59p+0, 0x1.22bde062457bcp+0, -0x1.4d75c79c34858p-6, 0x1.1ca107889fa87p-2,
+0x1.293b529bec0fp-7, 0x1.962e1c9cc5f5p-7, 0x1.8a799844ae8ccp-1, 0x1.58a8b005e4849p-2,
+0x1.8c152633182a4p-3, 0x1.4491f1d4ef8a4p-1, 0x1.0f3d721884e14p-1, 0x1.df88d4aef244ep-1,
+0x1.b98c462f7318ap-1, 0x1.0ad13143af3cp-1, -0x1.193d570bcc145p-3, 0x1.0d0d0e8880808p-3,
+0x1.2c110594be886p-1, 0x1.456fd01824792p-1, 0x1.277e3a21822fbp+0, -0x1.20b4dc924169cp-3,
+0x1.5adcf3b78286bp-2, 0x1.82431e7637b94p-4, 0x1.3800e3833cce8p-1, 0x1.c161c5f6b5f6bp-2,
+0x1.0595947e0b2b2p+0, 0x1.766a0ebfb9a0ep-1, 0x1.81479917cf5cp-1, 0x1.05b579853e9e2p-1,
+-0x1.532888c5d9845p-3, 0x1.7b19266c8fcbep-1, 0x1.a28cb062784c8p-1, 0x1.117dbb32efc84p+0,
+0x1.5a2e80c51ac36p-1, 0x1.fe87688bfd0ecp-1, 0x1.2b964ef8bd93p-3, 0x1.c539d47b8a73ap-1,
+-0x1.8619159fd8ffp-3, 0x1.1de2c9376ef8cp+0, 0x1.64f8c24f96bd8p-6, 0x1.9f95aa2cd8c4cp-3,
+0x1.19f11dd7cd7bcp-1, 0x1.80cb9e9167fdap-1, -0x1.ef82731d789ecp-5, 0x1.b45bf66d02518p-3,
+0x1.29b34b48b9cccp-4, 0x1.1ee9719bd768p-9, 0x1.16c0a7a3c71aep-1, 0x1.b7add5643c288p-1,
+0x1.acf51ff026b72p-1, 0x1.fead6af596f47p-2, 0x1.d5e704a612348p-1, -0x1.8059940300b38p-6,
+0x1.96057faff8d7cp-1, 0x1.4f03037a9e05fp-2, 0x1.3b147cc1a95c2p-1, 0x1.3aca42400f2e2p-1,
+-0x1.21eb57bbdd705p-3, 0x1.57d6bdcc4947p-3, -0x1.2f355535919ep-4, -0x1.b6f48dd03ab5fp-4,
+0x1.1bba9e230442p+0, 0x1.e30c6c27c618cp-1, 0x1.2941a5891f501p+0, 0x1.2b3d56a4bce1p-1,
+0x1.7b2d6e47c327ap-1, 0x1.b813c32370274p-4, 0x1.142189688ea96p-2, 0x1.800d8f46334e4p-1,
+0x1.8c348ce97ecfp-6, 0x1.f73de25a54e23p-2, 0x1.272cb01be7f2fp+0, 0x1.8cb928a57fd8ap-1,
+0x1.6042952926eb4p-5, -0x1.b8296b303d1fbp-4, 0x1.301b46539369cp+0, 0x1.4341f244201d7p-2,
+0x1.8401138fd4cfp-4, 0x1.1090cddeedee6p-1, -0x1.a2f2fcb679198p-6, 0x1.21edd46443dbap+0,
+-0x1.59fb8c491a5d8p-3, 0x1.179ae9936269p+0, -0x1.746c51efb5a58p-4, 0x1.a5ed030418a6cp-1,
+0x1.c143b9e04f542p-3, 0x1.72ed58ea190dep-1, 0x1.e9437b7705bap-3, 0x1.1c78fddf05becp-2,
+0x1.17a4b761c8e3p+0, 0x1.75a1353aeb425p-2, 0x1.7b88a737c3de1p-2, 0x1.002c225199f1ep+0,
+0x1.bbb502c9ddd04p-4, 0x1.53c27084411e7p-2, 0x1.8a5e69b7e1899p-2, 0x1.0c853a867f70dp+0,
+0x1.474a170cf4fa8p-1, 0x1.b5a65ff69e7fep-1, 0x1.32b19de7323p-1, 0x1.ba1221e040f1p-1,
+0x1.2b7baadf23c42p-3, 0x1.1aa497b89baf8p-1, 0x1.c0c9c83381939p-2, 0x1.8e92f4e1838c3p-2,
+0x1.4a05d0b8fa72p-1, 0x1.b46a14b5026dbp-2, 0x1.cf50d9f9383b4p-1, 0x1.e0ec5996f50bep-1,
+0x1.28961f4feac5ep+0, 0x1.144fd43cf56c7p+0, 0x1.be619bf37cc32p-1, 0x1.3089e0fcc77a2p+0,
+0x1.f16f1534afaaep-1, 0x1.f63a781bec74ep-1, 0x1.a09a5e91a79b2p-1, -0x1.2998afcf1fffp-7,
+0x1.02c16a9f9f1c6p-1, -0x1.2deca3f25bd95p-3, 0x1.dff9052d598b9p-2, 0x1.9748e5ee61c4fp-2,
+0x1.ab77b019bd55bp-2, 0x1.0a139e4c7a8dap+0, 0x1.965944b99318ep-3, 0x1.7398decc80cb4p-1,
+0x1.5e8839bc56a9ep-3, 0x1.912bec70bbf16p-1, 0x1.263ced6d7fadp-1, 0x1.02a945f13885cp+0,
+0x1.c0d7cbf6b4e2bp-2, -0x1.aefb6236912a8p-6, 0x1.58fe4756b1fc8p-1, 0x1.91b1371989c8cp-1,
+0x1.7393230d4d8cap-1, -0x1.6819d7af9d00ap-4, -0x1.ad769c368e208p-6, 0x1.5cca35691ffacp-3,
+0x1.139835caf3fd2p-1, 0x1.1425c5bef5186p+0, -0x1.723bfbd617ab4p-4, 0x1.fcbc1bfd9311dp-2,
+0x1.ea84cd8bd509ap-1, 0x1.f68082e4b9cdep-1, 0x1.f216d318b0fa7p-2, 0x1.758d7c5484b48p-1,
+0x1.86549494a642cp-1, 0x1.99fb0dbccd8f8p-4, 0x1.d74d7ffbae9bp-1, 0x1.157cc6422af98p-4,
+0x1.38aa7c85a4882p-3, 0x1.838e70996d834p-3, 0x1.54ba722b7641cp-1, 0x1.8a4cdd94ae334p-1,
+0x1.d48e4a6a0f828p-6, 0x1.105b94e020b72p+0, 0x1.2efeabf591308p-2, 0x1.9959ce519919fp-2,
+0x1.4b7cafca96f96p-1, 0x1.121154e75755dp+0, 0x1.ae6432935cc86p-3, -0x1.d3ee853074a9ep-4,
+-0x1.3eee5ebc17766p-3, 0x1.157edd30f7ca8p+0, 0x1.bd99ccdf7b338p-1, 0x1.8a3df1c4ae158p-1,
+0x1.323072e9312dbp+0, 0x1.0b4a3f3216948p+0, 0x1.23eb72c57b0a1p+0, 0x1.1192b5315658ap-1,
+0x1.d879a37bb0f34p-1, -0x1.335c016f3384ep-3, -0x1.59d68cd91a138p-3, 0x1.5c980a9b85fcep-1,
+0x1.0807f477a9a98p+0, 0x1.08fc2cbc785eap-1, 0x1.aefc8226912c4p-3, 0x1.2ffe171d932f6p-1,
+0x1.a2a1f4da78772p-1, -0x1.1ace2f3568cfap-4, 0x1.b914164c3ef4ep-1, 0x1.2b997d33f0cc9p+0,
+0x1.47e079575c8dbp-2, 0x1.4ed044176a6d5p-2, 0x1.7b1971908fcc6p-1, 0x1.18fb156565294p-1,
+0x1.86e3959640fa4p-3, -0x1.4f367b829e6dp-3, 0x1.2607317d18db3p+0, 0x1.09cdfdcb46cf3p+0,
+0x1.1b5db8ad03884p+0, 0x1.450424cc23a1cp-3, 0x1.1fc248ab72b7cp+0, 0x1.26b32008b3ccap+0,
+0x1.5d85d28f87d84p-5, 0x1.96b7f7ca60a32p-1, 0x1.713dcb6faf486p-1, 0x1.3d2dc94f4728p-5,
+0x1.46e60fc82765cp-1, 0x1.52ae4a8ea55c8p-1, 0x1.8bcbf82cb1318p-1, 0x1.71f299afb0b1fp-2,
+0x1.6c3db0993ee1cp-1, 0x1.9bbcbb5cd113p-1, -0x1.43543be286a88p-3, 0x1.15e733222bce6p-1,
+0x1.f2940d97185b4p-4, 0x1.02a0efeed20eap-2, -0x1.0408e1620811ep-4, 0x1.23ad6e79e0f47p+0,
+0x1.88ba30f977dabp-2, 0x1.fef9608664592p-1, 0x1.1c13b877d1c1p+0, 0x1.ceb3bb8ed09aap-1,
+0x1.ffd8e15d994b4p-4, 0x1.4cda7c19cce82p-1, 0x1.0290d5106b881p-2, 0x1.081a67f7a9ce6p-1,
+0x1.5f73439f8bb34p-1, 0x1.9bc19c599de9ap-3, 0x1.6a9ffa446ed97p-2, 0x1.2fc84e8d92c3ep-1,
+0x1.1e97d6afd6c94p-1, 0x1.1cdc501a39b89p-2, 0x1.16c8283893f6ap-1, 0x1.9ad69a44cf46cp-1,
+-0x1.05011a3ba39bep-3, 0x1.0cfc69e219f8cp-4, 0x1.0a87eea0150fdp+0, 0x1.6c0c2f9fa4e52p-1,
+0x1.dab43e314f02p-1, 0x1.3a756f00db514p-1, -0x1.0583a7d20b076p-3, 0x1.c11710bd1bc7bp-2,
+0x1.bf2f0fdd17f7cp-3, -0x1.5e7c9435f02c7p-4, 0x1.2e6c90f3900c5p+0, 0x1.1484ac108f6fcp-1,
+0x1.77ce97b956037p-2, -0x1.50730589074c9p-4, 0x1.eaf24530a2b15p-2, 0x1.e6aacabfcd558p-1,
+0x1.1da8b320a1b7dp+0, 0x1.8e745a431ce8bp-2, 0x1.4ef81fe29df04p-1, 0x1.4e61c00f699p-5,
+-0x1.4946f4c2928dfp-3, 0x1.1b5378689d0d6p+0, 0x1.8366ea5f06cdcp-1, 0x1.7387ecd54d764p-1,
+0x1.b9878c09d9754p-4, -0x1.6d7bf7560e2b4p-4, 0x1.e74ea7e3ce9d4p-4, 0x1.bc2f2e97785e6p-1,
+0x1.8e4a1f1182fa9p-2, 0x1.ba18639b7430cp-1, 0x1.e13ec4e08f4a3p-2, 0x1.d8965ec07df97p-2,
+0x1.210f2b9f0eeb2p+0, 0x1.3e91b288e389bp-2, -0x1.c1e0ed8383c28p-6, 0x1.b66c2f036cd86p-1,
+0x1.20125758a68b1p+0, 0x1.6f67505c7868p-5, 0x1.848a87afd5e1cp-4, 0x1.262830f24c506p-3,
+0x1.463523ac2603ep-3, 0x1.382063b5a373cp-4, 0x1.c4751eb388ea4p-1, 0x1.73dafb2e1ae92p-1,
+0x1.8d7048afe7ad4p-3, 0x1.4e1f6b7f690b8p-3, 0x1.e83ebf03d07d7p-2, 0x1.c2389009ead78p-4,
+0x1.81286e67cf1dap-1, -0x1.1a77383bce882p-4, 0x1.672728d134b4bp-2, 0x1.953d179d90e08p-1,
+-0x1.4c397288fed95p-3, -0x1.7b5f3d22f6be9p-4, 0x1.44bd3c18efe0dp-2, 0x1.2a23ed15877bp-3,
+0x1.295ffae8b926p-6, 0x1.45aed96f582a8p-1, -0x1.7eb8f22630a52p-3, 0x1.36d675cc07468p-1,
+0x1.32c1ad3d98b69p-2, 0x1.eeaf189a43c47p-2, -0x1.0d1304fee6f2ep-3, 0x1.d4631dc3a8c64p-3,
+0x1.fd06cbfd93a74p-1, 0x1.5129dc02a2538p-5, -0x1.d70b7fbd47b0bp-4, 0x1.d6c51442e0bd4p-1,
+0x1.24def258b0244p-2, 0x1.70591d92e0b22p-3, -0x1.185d17b230ba4p-3, 0x1.4a63287dc7f98p-1,
+0x1.d3017483a602dp-2, 0x1.e4c43f2d6322p-1, 0x1.5f5ef4ff8b8acp-3, 0x1.b34332d9cceccp-1,
+-0x1.70d262f614d81p-4, 0x1.b25d83283187ep-1, 0x1.28f855a0b8571p+0, 0x1.b97488750c82ap-1,
+0x1.f57502871e1d4p-1, 0x1.3e3bb28749441p-2, 0x1.d096734d3ac67p-2, 0x1.046686286f337p+0,
+0x1.ac30b00b58615p-2, 0x1.f1103e197bba2p-1, -0x1.3105ed5bfba58p-5, 0x1.45c9be48f1f9ep-1,
+0x1.a0b16239a7c91p-2, -0x1.8b069f1cafa7p-6, 0x1.639cda8f94064p-5, 0x1.d01fee2206a64p-1,
+0x1.5165bdc03c65p-1, 0x1.cadb967d2f50cp-4, -0x1.096d86c87941ap-4, 0x1.d00c46a3a0187p-2,
+0x1.69a8edec6ceb7p-2, 0x1.4ae8b2b5c904p-6, 0x1.619344a2c3268p-3, 0x1.adaa568e8e87ep-1,
+0x1.99a7e6cccce97p-2, 0x1.e2cfc68a2c05cp-3, 0x1.234e3140ad02cp-2, 0x1.0e5d8a074fee4p+0,
+-0x1.1dc6b3823b8ep-6, 0x1.4fe53c4c39642p-1, 0x1.6997e07c6cc94p-1, 0x1.7aef235c8f77cp-4,
+0x1.37b8b210d5d7bp-2, 0x1.5522255777112p-1, 0x1.279c69a3826cp+0, 0x1.5757a94915158p-4,
+0x1.2d533280c10cdp+0, 0x1.a23b4d0e77a9bp-2, -0x1.9573278ff7b32p-4, 0x1.94b0ad365c947p-2,
+0x1.6f1df8d2de3bep-3, 0x1.053d14f53dad4p-4, -0x1.5911461f7eef6p-3, 0x1.928695bd8b738p-1,
+0x1.ead7504708e1ap-3, 0x1.32df143bff578p-4, 0x1.f8803ae72433bp-2, 0x1.1940fc1c3281fp+0,
+0x1.8c3b77864baa1p-2, 0x1.4178d30682f1ap-1, 0x1.68436a3c6a207p-2, 0x1.e158991fc2b14p-1,
+0x1.b2367f0297a04p-1, 0x1.72ececad4c402p-1, 0x1.289c89425139p-1, 0x1.8a40bfcfe14ep-5,
+0x1.2903a25b1ed41p+0, 0x1.1055042753dd4p+0, -0x1.883a32d643a7bp-4, -0x1.d4d5751d4344cp-5,
+0x1.0a28de2ee11e8p-1, 0x1.9ef700880abacp-1, 0x1.e1dbce0090844p-3, 0x1.0635ceced9387p+0,
+0x1.1b657ee70397cp-2, 0x1.852581830a4aep-3, -0x1.787e9d295763bp-4, 0x1.03e57c1207cafp-2,
+0x1.98cd6d4e64cep-1, 0x1.2a0b73cf20e2p-7, 0x1.b2b17b10322fcp-1, 0x1.2d7da8f4c161cp+0,
+0x1.176c6db3c8727p-2, 0x1.c2d38feeb8da6p-1, 0x1.871b813b0e37p-1, 0x1.6cd271520cd8p-1,
+0x1.27caec711c62ap+0, 0x1.cf5384839ea68p-5, 0x1.38ee031e71dcp-1, 0x1.5e9a5c72bd34bp-2,
+0x1.c4d471b523428p-1, 0x1.29bb0f5186a95p+0, 0x1.51fb07690a5c4p-4, 0x1.10a48a4bbae2ap-1,
+0x1.5ffca4e45992cp-1, 0x1.b942509b7284ap-1, 0x1.8faefcb4b8f78p-1, 0x1.4b9d832e973bp-1,
+0x1.7385f27e1a3fp-1, 0x1.c50e1cc056e9p-1, 0x1.94b69243296dp-1, 0x1.7486a40fb5d9cp-5,
+0x1.fb3d6db8c3479p-2, -0x1.64e382a2c9c71p-3, -0x1.0ac97a3548c63p-3, 0x1.f1b7dcbbe36fcp-1,
+0x1.b9db9879da1d8p-3, -0x1.6b7978cfa3cp-6, 0x1.a8868b1ceaa6p-6, -0x1.7c884bfc92aa4p-3,
+0x1.7ecb21bc972fcp-3, 0x1.132e0ae7bff5bp+0, 0x1.311fd2ab2f0c7p+0, 0x1.51cf65af706b8p-1,
+0x1.82c93f57d25f4p-1, 0x1.82f4c0256c4fep-1, 0x1.60edc255f50eap-3, 0x1.6bf8b1ce0b248p-1,
+0x1.03282f6a06506p+0, 0x1.f78fda1a55862p-1, -0x1.2c82199259044p-3, 0x1.64be6a1d2fe32p-1,
+0x1.e49f925162d8cp-1, 0x1.161503bbc5c3ap-3, 0x1.df91c0508bfp-6, 0x1.bc6ba19378d73p-2,
+0x1.3296fbf8652ep+0, 0x1.0288f88ed1decp+0, -0x1.e498939d62cadp-4, 0x1.724d8402e49bp-1,
+0x1.63b9a771faa68p-1, 0x1.be89e635e37a2p-1, 0x1.effc54aa465fp-1, -0x1.43820768ed6bp-7,
+0x1.cbb76bf931086p-1, 0x1.09d82e447a16cp+0, 0x1.29881d8253103p+0, -0x1.61c0a2a2c3816p-4,
+-0x1.784756a623c1ep-3, -0x1.847dc2363c3p-7, -0x1.279e073be8d5cp-4, 0x1.a01d64b00d07ap-3,
+-0x1.18711e9564158p-3, -0x1.48d40fe8f80e9p-4, 0x1.101e92a3b9d6cp+0, 0x1.a3135e18dfc06p-1,
+0x1.c040a48eb3b48p-1, 0x1.2122f70f0f128p-5, 0x1.514b52f5d5c9dp-2, 0x1.602a9cfc59eecp-1,
+-0x1.7311736c7fbc8p-3, 0x1.87d712f976147p-2, 0x1.7a0a82b627484p-3, 0x1.ee419bdca95p-1,
+0x1.6fd730d7ac7b2p-1, 0x1.a7cb2a2ce92ffp-2, 0x1.984418fffd54ep-3, 0x1.6e9ec25c76d72p-1,
+0x1.ca447f206155cp-3, 0x1.1fc8b46572c49p-2, 0x1.ea177fe3d42eep-3, 0x1.1e5896d03cb13p+0,
+-0x1.7f825fdc989e8p-5, 0x1.06f38dcedab3p-7, -0x1.761a071c85cdcp-4, 0x1.0d12d630e6f27p+0,
+-0x1.3a68eeaf419ebp-3, -0x1.0865b12baa65p-3, 0x1.2a29ff39ededap+0, -0x1.1916abbbcbc7p-3,
+0x1.e3b0312a2dc68p-5, -0x1.b83146fd09fc4p-4, 0x1.1050295220a04p-2, 0x1.f4290eca4eb88p-4,
+0x1.916ee2698943p-7, 0x1.07fb4e120ff68p-3, 0x1.23ff732c47feep+0, 0x1.167663422cecdp+0,
+0x1.74eed2b7b6aa7p-2, 0x1.147c52da28f8ap-2, 0x1.26b0fd14b3c86p-1, 0x1.8832e5ce4398fp-2,
+0x1.b490195035edp-1, 0x1.eb9a0428a400cp-1, 0x1.2fd2a17592d86p-3, 0x1.7c01c777c4d05p-2,
+0x1.6464cb62c8c98p-3, 0x1.186c1503ca71cp-1, -0x1.ce3602706938ep-4, 0x1.3210b90730ee4p-1,
+0x1.075b6ace751d4p+0, 0x1.4e4b0c229c961p-2, 0x1.085b804143ea2p-1, 0x1.2e928b02c38b7p+0,
+0x1.11a7baaef01c4p-1, 0x1.3ffea5c41996ep-1, 0x1.08722dfdaa7dfp+0, 0x1.2973e56f1fb4ap-1,
+0x1.644b9fdf9564p-1, 0x1.fed1f408ca70cp-1, 0x1.4994a0e693294p-1, 0x1.e8ed095e38406p-1,
+0x1.171918c7c7cbdp+0, 0x1.1c118dfb04efep+0, -0x1.f7a1d9a3ef43cp-4, -0x1.8f73ca69854ep-4,
+0x1.3bb890e8ddd74p-5, -0x1.756eed1fb7aabp-3, 0x1.30b259cec7cb1p+0, 0x1.349958d66932ap-1,
+0x1.2691a91719f01p-2, 0x1.21af4a46435eap-1, 0x1.2f8c9911f8b2cp+0, -0x1.e8d788aa3815cp-5,
+0x1.4dc5d005cebedp-2, 0x1.129dd055586ecp-3, 0x1.05d9d197a54d4p-1, 0x1.66628141fff82p-1,
+0x1.c379ef7f86f3ep-1, 0x1.327977affe8c8p-1, 0x1.90669f1654004p-4, 0x1.6bca5eb60ac7ep-1,
+0x1.2002b213d99efp+0, 0x1.a0ceba8a74d0ap-1, 0x1.62890e4f91deep-1, 0x1.d68d70e079e7bp-2,
+0x1.e99be78a399e2p-3, 0x1.0d0703e480746p-1, -0x1.46af22328d5e5p-3, 0x1.228c80144519p+0,
+0x1.4ae5230295ca3p-2, 0x1.5e4f3ec056382p-1, 0x1.c79fa31ac2728p-1, 0x1.b4f9729369f2ep-3,
+0x1.300bf44ff9b18p-1, 0x1.ef11ce4caaf06p-1, 0x1.436c937c2072bp-2, 0x1.aa2de3c4edf56p-1,
+0x1.f81c7970bd05cp-1, 0x1.39692ddf3f9f3p-2, 0x1.e18358bd5ca02p-3, 0x1.27f73c824fee4p-4,
+0x1.126523ce24ca5p+0, 0x1.c44e87b3889dp-3, 0x1.b35f55b0338b6p-3, 0x1.951b24e32a364p-3,
+0x1.1c217c689ea94p-1, 0x1.d9180d6fb2302p-1, 0x1.1907d87098761p+0, 0x1.e4d41606fcdb4p-3,
+0x1.4a563d6761793p-2, -0x1.24f0d40249e2p-8, 0x1.25b2e54f1832ap+0, 0x1.fb2871d3f650cp-3,
+0x1.02759fa46b51bp+0, 0x1.47887281c244p-1, 0x1.d0773b4ba0ee6p-1, 0x1.8ebd2bf650ad4p-5,
+-0x1.1d6f005bd477cp-5, 0x1.e531d92563fd6p-1, -0x1.0c326fcee532p-6, 0x1.f4040fc3e8081p-2,
+0x1.ba3562f3746abp-2, 0x1.12d23b0158d7bp+0, 0x1.cda6caf2ce80cp-1, -0x1.64ff028930647p-3,
+0x1.ae4fdde8f6396p-1, 0x1.1ed5c89bd745p-6, 0x1.b754898ea1dc4p-1, 0x1.4005f0edb33fp-1,
+0x1.0c11aba07e89cp-1, -0x1.b588357037dd4p-4, 0x1.cb6b3ee463a34p-1, 0x1.94eb19a1903c9p-2,
+0x1.4192034a83241p-2, -0x1.711a90afaf02p-4, 0x1.9622bc6ff9124p-1, 0x1.11a8723cf01dbp+0,
+0x1.08ad90e0115b2p+0, 0x1.61cc06eac398p-1, 0x1.b0fc1c7cfb91cp-4, 0x1.407f681f4dcb8p-3,
+0x1.c5e88ba9256acp-1, 0x1.b1ee7c1cfd768p-5, 0x1.35505ce3376d8p-1, 0x1.646d648b95a78p-1,
+0x1.c90dc0a9f881ep-1, 0x1.3ec26385b0b7fp-2, 0x1.e3bf9db16118cp-1, 0x1.0ece9b881d9d4p+0,
+0x1.e2ca47c3c5948p-5, 0x1.20e2384ca82aep+0, 0x1.6271b10c5e7cfp-2, 0x1.61adbc61f68eap-1,
+0x1.0081401acdcf4p+0, 0x1.8793d0cfdbf44p-5, 0x1.6ed4622610dcp-1, 0x1.48ebf7b291d7ep-1,
+0x1.0faca37bb8f2ep-2, 0x1.7f850a9165707p-2, 0x1.145c11a228b8p-4, 0x1.fa4e63c4c169ap-1,
+0x1.deefca0d57791p-2, 0x1.2a2e93bf87906p+0, 0x1.797628a6261f6p-3, 0x1.f6a74d1253b5p-1,
+-0x1.00b2440b9afe2p-3, 0x1.2d735682c14d1p+0, 0x1.b391cb2033f06p-1, 0x1.1bca7b91d12e9p+0,
+0x1.564c4d8446322p-1, 0x1.280bda8b1ce48p+0, 0x1.0a7356287b4dp-4, 0x1.6b9ce582d739bp-2,
+0x1.340d9b02681bp-7, 0x1.bd052e0ead3d8p-1, -0x1.30aa3c7bfaee2p-3, 0x1.1a222ec101113p+0,
+-0x1.4000d29c199b8p-6, 0x1.fdfb74fe625d4p-1, 0x1.eb7b2e263d5ccp-1, 0x1.ea4c113707cb4p-3,
+0x1.d9597f2bb2b3p-1, 0x1.b26d020364dap-4, 0x1.2153938b0f73fp+0, 0x1.73f598f54e518p-1,
+0x1.6a5a8772d4b51p-2, 0x1.4b1522d5c95d6p-1, 0x1.59eca8ef80a62p-3, 0x1.a369fbddad3a6p-1,
+-0x1.6e3af9360fa93p-3, 0x1.beda25ad174ddp-2, 0x1.3751f9366ea3ep-1, 0x1.f49f1a3f1c715p-2,
+0x1.9ac7a7de68c27p-2, 0x1.fc15e9c65e924p-1, 0x1.1520e796f70e8p-2, 0x1.e73b52a568103p-2,
+0x1.f096305fe12c6p-1, -0x1.42213c0284428p-4, 0x1.8998741fdffdbp-2, 0x1.c0f82ef04ebd1p-2,
+-0x1.f496c683e92dap-4, 0x1.4c810b3b65ceep-1, 0x1.fcb0f0a592fb6p-1, 0x1.651e200f9708cp-4,
+0x1.463fa5bc2618dp-2, 0x1.0b7663f67d533p+0, -0x1.5f913a02bf23p-7, 0x1.ff0c655f314bfp-2,
+0x1.ae81d67f5d03ap-1, 0x1.2631a7d24c635p+0, 0x1.e07f9d695a98ep-1, 0x1.2174ef44a9504p-1,
+0x1.c4a897e9efb78p-5, 0x1.bcc05e137980cp-1, 0x1.78210e6fbd0ecp-4, 0x1.37de339e6fbc6p-1,
+0x1.42de34fa85bc7p-2, 0x1.d7cb64ebaf96bp-2, 0x1.d387244073db2p-3, 0x1.588d85377de7dp-2,
+0x1.18dc95d964ec6p+0, 0x1.094d145679009p+0, 0x1.067e5b10d9c98p+0, 0x1.316d326bfc73fp-2,
+0x1.a849ac0750936p-1, 0x1.89361c0978d28p-4, 0x1.f2baa8f4b2422p-1, 0x1.32797600cb596p-1,
+0x1.bd2409b37a48p-3, 0x1.4481f2628903cp-3, -0x1.4dc363cc35206p-3, 0x1.2e3920058fa57p-2,
+0x1.0203f71d373b2p+0, 0x1.07d33f0c760cep+0, 0x1.2a26ba6b211a4p-1, 0x1.03056ab2060acp-3,
+0x1.c02cdf9f8059cp-1, 0x1.8b0edbef161dap-1, 0x1.a6adf3c81a28ap-1, 0x1.08484fb2dd5d6p-1,
+0x1.710bc527aee44p-1, 0x1.20c72ac574c18p-1, -0x1.e5493ba3ca929p-4, 0x1.f3bcb50cb4462p-1,
+0x1.dc8489b3b909p-3, 0x1.63058315f93e2p-3, 0x1.8a69047e48053p-2, 0x1.7ef6a35631206p-1,
+0x1.ab0d79a1bc816p-1, 0x1.a07cb1b5a75fcp-1, -0x1.d94803d07f5cep-4, 0x1.76603ee8865ap-1,
+0x1.4cb073f69960ep-1, 0x1.1c1d0e070506ep+0, -0x1.5d3e391f87494p-3, 0x1.1d27732f071bap-2,
+0x1.7d3c946960dep-8, 0x1.00e8c0899b6b2p+0, 0x1.13b9caff5aa6cp+0, 0x1.b153c3f82f745p-2,
+};
+
+static const int babl_num_type_test_pixels = 512;
+
+static const double babl_type_test_pixels[2048] = {
+0x1.87326f630e64ep+3, 0x1.d98b8203b317p+6, 0x1.80c353a70186ap+6, 0x1.8b30cef31661ap+6,
+0x1.ed4afa3bda95fp+6, 0x1.5b6f8b7eb6df1p+6, 0x1.a149bf2b42938p+5, 0x1.a42310c348462p+3,
+0x1.076180960ec3p+6, 0x1.70fdcafae1fb9p+5, 0x1.b56661636acccp+3, 0x1.e920a48bd2415p+6,
+0x1.6d6c669adad8dp+6, 0x1.db6bd983b6d7bp+4, 0x1.fcd15da3f9a2cp+3, 0x1.0228b6ca04517p+5,
+0x1.ef3cee63de79ep+6, 0x1.8dfaef231bf5ep+5, 0x1.5ee3acfebdc76p+6, 0x1.668783d6cd0fp+6,
+0x1.205f038640bep+6, 0x1.f9fa8d2ff3f52p+6, 0x1.20a64bea414c9p+6, 0x1.ee5b3f63dcb68p+5,
+0x1.2c44ab0a58895p+6, 0x1.927c053324f81p+4, 0x1.98d196cf31a33p+6, 0x1.4635fc0e8c6cp+6,
+0x1.7e5e224afcbc4p+6, 0x1.1a3f9972347f3p+4, 0x1.c6f50c538dea2p+4, 0x1.af4470375e88ep+6,
+0x1.00db42e201b68p+3, 0x1.f28096bfe5013p+6, 0x1.3a753f2674ea8p+6, 0x1.accc52835998ap+1,
+0x1.4df0223a9be04p+6, 0x1.6343d782c687bp+1, 0x1.07ab12b20f562p+4, 0x1.55468b42aa8d1p+4,
+0x1.873208730e641p+5, 0x1.e25e4373c4bc8p+4, 0x1.f3923ac3e7247p+3, 0x1.882b56831056bp+3,
+0x1.dee50e7bbdca2p+5, 0x1.f831cc33f063ap+4, 0x1.64338c6ac8672p+5, 0x1.bd5eeb3b7abddp+5,
+0x1.4509ea9e8a13dp+6, 0x1.0fd733421fae6p+2, 0x1.14dbe5c229b7dp+4, 0x1.95a3b8832b477p+4,
+0x1.5f000c02be002p+1, 0x1.65dd455acbba9p+6, 0x1.5c968dd2b92d2p+6, 0x1.373cab6a6e795p+6,
+0x1.ca7c46ab94f89p+6, 0x1.ead04943d5a09p+5, 0x1.f5ca9de3eb954p+4, 0x1.48da68f291b4dp+6,
+0x1.3bf80afe77f01p+6, 0x1.de5fd51bbcbfbp+5, 0x1.f03db24be07b6p+5, 0x1.5c13735eb826ep+6,
+0x1.c361029386c2p+5, 0x1.94a0c24329418p+3, 0x1.6979d5f2d2f3bp+6, 0x1.7d051c22fa0a4p+3,
+0x1.ed71b823dae37p+3, 0x1.ab649aa356c93p+6, 0x1.09e48caa13c92p+5, 0x1.01473b3e028e7p+6,
+0x1.1fe15be23fc2bp+3, 0x1.86c91b5b0d923p+5, 0x1.324ca60e64995p+6, 0x1.136eb2ba26dd6p+6,
+0x1.417100ba82e2p+6, 0x1.e4666c47c8ccep+6, 0x1.f21e2857e43c5p+6, 0x1.0cf5d6aa19ebbp+5,
+0x1.f563df7beac7cp+6, 0x1.baa90e2375522p+3, 0x1.d7c7b2ebaf8f6p+5, 0x1.6f7f6002defecp-4,
+0x1.9d32671f3a64dp+6, 0x1.21e99d1243d34p+4, 0x1.37988b466f311p+6, 0x1.67aeadc6cf5d6p+6,
+0x1.3de28be67bc51p+6, 0x1.b50b32bf6a166p+6, 0x1.61122d6ac2246p+5, 0x1.e76a5b93ced4bp+4,
+0x1.48763a9290ec7p+5, 0x1.a8a7efdb514fep+6, 0x1.d5ee0a43abdc1p+6, 0x1.85eb9e970bd74p+6,
+0x1.db3c0827b6781p+6, 0x1.3f67e0327ecfcp+6, 0x1.b58c421b6b188p+6, 0x1.8ea3f2831d47ep+2,
+0x1.d598f5a3ab31fp+5, 0x1.d3f44363a7e88p+3, 0x1.1a317a6a3462fp+6, 0x1.0ec8a64e1d915p+6,
+0x1.fbc62c33f78c6p+5, 0x1.31f881d263f1p+4, 0x1.11bac82223759p+3, 0x1.faa0b683f5417p+3,
+0x1.872465c30e48dp+3, 0x1.455815828ab03p+2, 0x1.8b9e044b173c1p+5, 0x1.324361826486cp+3,
+0x1.2eaa8c725d552p+4, 0x1.b1b2db9b6365bp+6, 0x1.352260626a44cp+3, 0x1.e8dd0a3fd1ba1p+6,
+0x1.fa2d42dff45a8p+6, 0x1.5e3cd752bc79bp+6, 0x1.508bb802a1177p+6, 0x1.380fcec6701fap+6,
+0x1.13480a0e26901p+6, 0x1.14ceb802299d7p-2, 0x1.b1ea65ab63d4dp+6, 0x1.b78327576f065p+6,
+0x1.a9bcbe9353798p+6, 0x1.87d86feb0fb0ep+6, 0x1.3d6ec5ea7add9p+6, 0x1.84f8c6b709f19p+6,
+0x1.8e80a0331d014p+5, 0x1.e5f61003cbec2p+5, 0x1.9de305e33bc61p+6, 0x1.b20ccaef64199p+6,
+0x1.2d79906e5af32p+6, 0x1.70290092e052p+5, 0x1.81aae2730355cp+5, 0x1.5ae53422b5ca7p+3,
+0x1.0492a0be09254p+6, 0x1.c61994838c333p+5, 0x1.aac2f5535585fp+4, 0x1.35772d7a6aee6p+6,
+0x1.eec49733dd893p+5, 0x1.307fbf7a60ff8p+6, 0x1.5bbf99aab77f3p+6, 0x1.430ceeba8619ep+6,
+0x1.c465362388ca7p+5, 0x1.8263e5b704c7dp+6, 0x1.2be9f8f657d3fp+6, 0x1.b8bfbbe3717f7p+5,
+0x1.c1417a0b8282fp+5, 0x1.f1d6c3d3e3ad8p+4, 0x1.46facb428df59p+2, 0x1.f3e8c713e7d19p+6,
+0x1.f629feb3ec54p+4, 0x1.c65a125f8cb42p+6, 0x1.ab6bee6b56d7ep+6, 0x1.3a39f2027473ep+3,
+0x1.4e3282469c65p+6, 0x1.d1b568a3a36adp+5, 0x1.ac4004f758801p+6, 0x1.572d25c2ae5a5p+2,
+0x1.dbd5bc57b7ab8p+6, 0x1.4a230ad694461p+6, 0x1.c77f9d4b8eff4p+6, 0x1.094f4cc2129eap+6,
+0x1.1bc58e02378b2p-1, 0x1.10aa1d0a21544p+5, 0x1.34abf34a6957ep+6, 0x1.06ca2bde0d945p+6,
+0x1.6b61d8c6d6c3bp+6, 0x1.9f5cb09f3eb96p+6, 0x1.e20acaa3c4159p+3, 0x1.8b10917316212p+4,
+0x1.9fb8e0333f71cp+5, 0x1.9800f2ff3001ep+6, 0x1.a5d113174ba22p+6, 0x1.b20f0b2b641e1p+6,
+0x1.1a64d8b634c9bp+6, 0x1.a376181346ec3p+5, 0x1.1cddd23239bbap+5, 0x1.fb0595bbf60b3p+6,
+0x1.4e30bd029c618p+6, 0x1.45bd2b9a8b7a5p+5, 0x1.eeee5ccfdddccp+6, 0x1.cbbb3caf97768p+6,
+0x1.a4e2a0a349c54p+4, 0x1.9a5a4b3734b49p+6, 0x1.f3027aefe604fp+6, 0x1.b76b2a6f6ed65p+6,
+0x1.0669ff0a0cd4p+5, 0x1.9f427fe73e85p+6, 0x1.ccddfccf99bcp+6, 0x1.7c2aef62f855ep+4,
+0x1.d2cb1573a5963p+5, 0x1.945d9a1728bb3p+6, 0x1.685a089ed0b41p+6, 0x1.d73a2bb3ae745p+5,
+0x1.cb2a898396551p+2, 0x1.3a0bf7ca7417fp+5, 0x1.f26741b7e4ce8p+6, 0x1.8814815f1029p+6,
+0x1.e3156403c62adp+3, 0x1.7544d842ea89bp+3, 0x1.ead8a5bfd5b15p+6, 0x1.0c3f1c9a187e4p+6,
+0x1.c6a98e078d532p+6, 0x1.90a9b8d321537p+6, 0x1.7c9c4f8af938ap+5, 0x1.c21ccd738439ap+5,
+0x1.8993137313262p+4, 0x1.4cbd10de997a2p+6, 0x1.b827f8eb704ffp+5, 0x1.b09581df612bp+6,
+0x1.ef9ba6afdf375p+6, 0x1.9604b2832c096p+5, 0x1.7c50be8af8a18p+6, 0x1.63513b52c6a27p+4,
+0x1.957291d32ae52p+4, 0x1.6f53397adea67p+6, 0x1.03f7944207ef3p+2, 0x1.d12347f3a2469p+5,
+0x1.0e95b95e1d2b7p+6, 0x1.dd1d7613ba3afp+6, 0x1.479c5fd68f38cp+6, 0x1.f7fb4417eff69p+6,
+0x1.717b1026e2f62p+6, 0x1.5fecd0e2bfd9ap+5, 0x1.c730b3db8e616p+5, 0x1.8e2db8c31c5b7p+6,
+0x1.4cfc645699f8dp+6, 0x1.abff374357fe7p+5, 0x1.16423a1e2c847p+6, 0x1.895f10d712be2p+6,
+0x1.04a836aa09507p+6, 0x1.011adfda0235cp+6, 0x1.2b3c5ae25678bp+5, 0x1.96a389632d471p+5,
+0x1.2389315a47126p+5, 0x1.53ec5536a7d8bp+6, 0x1.ac602b6b58c05p+6, 0x1.e852bb13d0a57p+5,
+0x1.4152cc2282a5ap+5, 0x1.10e84fba21d0ap+5, 0x1.497dbeca92fb8p+5, 0x1.208a197a41143p+5,
+0x1.5376811ea6edp+6, 0x1.087cef6210f9ep+3, 0x1.d232b72ba4657p+5, 0x1.b8d3259371a65p+6,
+0x1.9062d76720c5bp+6, 0x1.f2b1a9b3e5635p+5, 0x1.42c9931a85932p+5, 0x1.3df121827be24p+5,
+0x1.acec95d359d93p+5, 0x1.e9012963d2025p+6, 0x1.2de7a9b25bcf5p+5, 0x1.1fc56c323f8aep+4,
+0x1.31ef23a263de4p+5, 0x1.7a8c2ec6f5186p+6, 0x1.d61f13cfac3e2p+6, 0x1.e5f3f627cbe7fp+6,
+0x1.422f29a2845e5p+4, 0x1.d8c29bdbb1853p+5, 0x1.6f5306fadea61p+6, 0x1.55340112aa68p+6,
+0x1.ed7c2dc7daf86p+6, 0x1.3c4d1a02789a3p+0, 0x1.042e2e02085c6p+3, 0x1.fd0319c3fa063p+4,
+0x1.58dd899eb1bb1p+6, 0x1.cce5f12f99cbep+6, 0x1.736a23fae6d44p+6, 0x1.f986efb3f30dep+6,
+0x1.55686422aad0dp+4, 0x1.829035c305207p+2, 0x1.1397f8da272ffp+5, 0x1.a8d09a2b51a13p+6,
+0x1.c9c50a63938a1p+3, 0x1.72e55802e5cabp+6, 0x1.61a3bfbac3478p+6, 0x1.c99b78b39336fp+6,
+0x1.b0f8b36361f16p+4, 0x1.8444a20308894p-1, 0x1.a25025d344a05p+4, 0x1.42b477c28568fp+6,
+0x1.ec09b2a7d8136p+6, 0x1.ff0fbc9bfe1f8p+5, 0x1.8aa5d2d3154bap+6, 0x1.0a0288ea14051p+5,
+0x1.e8503443d0a07p+4, 0x1.60c4e69ec189dp+6, 0x1.abd4ea6357a9dp+4, 0x1.953faef32a7f6p+5,
+0x1.3498d2226931ap+4, 0x1.da484197b4908p+6, 0x1.fd3d88c3fa7b1p+2, 0x1.d5131283aa262p+3,
+0x1.df3975ffbe72fp+6, 0x1.0166793202ccfp+4, 0x1.73c65182e78cap+5, 0x1.3816ff9e702ep+6,
+0x1.a7f1ef034fe3ep+1, 0x1.6a6a65e2d4d4dp+3, 0x1.319def4e633bep+6, 0x1.8a66a21314cd4p+4,
+0x1.15d940622bb28p+4, 0x1.bb69ebbb76d3dp+6, 0x1.6d485582da90bp+1, 0x1.fabbc593f5779p+4,
+0x1.2e4f43be5c9e8p+6, 0x1.6d0e0266da1cp+6, 0x1.2129a86242535p+4, 0x1.9a8d7097351aep+6,
+0x1.70168baee02d1p+6, 0x1.61bce71ac379dp+5, 0x1.ba83d0b37507ap+5, 0x1.5c203e52b8408p+6,
+0x1.b06651db60ccap+6, 0x1.9f9eeca33f3dep+4, 0x1.e12182cbc243p+6, 0x1.53d2f742a7a5fp+3,
+0x1.c8aca1c791594p+6, 0x1.305af58260b5fp+4, 0x1.ea346ccbd468ep+5, 0x1.5d2d6502ba5adp+2,
+0x1.32f7f7a265effp+3, 0x1.14ee0ef229dc2p+6, 0x1.41d4e28283a9cp+4, 0x1.661d3d02cc3a8p+0,
+0x1.5547ad3eaa8f6p+6, 0x1.0a58616214b0cp+6, 0x1.3daf74927b5efp+6, 0x1.62873cbac50e8p+6,
+0x1.37a5ae1e6f4b6p+6, 0x1.bd358f737a6b2p+4, 0x1.c520e53f8a41dp+6, 0x1.7d1bfe3afa38p+6,
+0x1.55ba7ca2ab75p+3, 0x1.d08b27eba1165p+6, 0x1.fbcaef9ff795ep+6, 0x1.59069352b20d2p+6,
+0x1.3d992a4e7b325p+6, 0x1.105566d220aadp+4, 0x1.e72807d3ce501p+5, 0x1.5b5f6bf2b6bedp+5,
+0x1.e9e79a83d3cf3p+5, 0x1.d0d5ec43a1abep+6, 0x1.39fe898273fd1p+1, 0x1.4ab43e3295688p+5,
+0x1.c5ed3b438bda7p+3, 0x1.eaf17717d5e2fp+6, 0x1.9fa8fc0b3f52p+5, 0x1.6a492c02d4926p-2,
+0x1.b841a3a370834p+3, 0x1.c4eeb46b89dd7p+6, 0x1.73d1f7c2e7a3fp+2, 0x1.759ccdb2eb39ap+4,
+0x1.b3b986b367731p+5, 0x1.9ec960733d92cp+4, 0x1.8bfea18317fd4p+4, 0x1.792384a2f2471p+3,
+0x1.720ab982e4157p+6, 0x1.a0af1cf3415e4p+6, 0x1.91abad4f23576p+6, 0x1.5360cf3aa6c1ap+5,
+0x1.ff901983ff203p+1, 0x1.56cc928aad992p+6, 0x1.36632ea26cc66p+3, 0x1.d59e8303ab3dp+3,
+0x1.2757ba724eaf7p+6, 0x1.14baaba229755p+3, 0x1.93ba63b72774cp+6, 0x1.93c3930327872p+4,
+0x1.9ab2bca335658p+4, 0x1.0e9ccf3a1d39ap+5, 0x1.12a09aba25413p+6, 0x1.5ba07c6eb741p+6,
+0x1.60914f72c122ap+4, 0x1.1c708f0638e12p+6, 0x1.f5370803ea6e1p-3, 0x1.21c3f68a4387fp+5,
+0x1.0762061a0ec41p+6, 0x1.a19e3313433c6p+5, 0x1.249888e249311p+5, 0x1.3e6a3a927cd47p+6,
+0x1.2b7b9be256f73p+5, 0x1.5312c7e2a6259p+5, 0x1.9bd16dff37a2ep+6, 0x1.6f9a914adf352p+6,
+0x1.113bbc0e22778p+6, 0x1.fed1165ffda23p+6, 0x1.9ebf01e33d7ep+6, 0x1.068ceb1a0d19dp+5,
+0x1.9f80334f3f006p+6, 0x1.306aaf2e60d56p+6, 0x1.2cf6dd2e59edcp+6, 0x1.af7cb41b5ef97p+6,
+0x1.0e6e83721cddp+5, 0x1.53c34302a7868p+6, 0x1.ea30847bd4611p+6, 0x1.ae8efc2b5d1ep+6,
+0x1.765a9876ecb53p+6, 0x1.7deae82efbd5dp+6, 0x1.37fe0e826ffc2p+2, 0x1.dd0747a3ba0e9p+6,
+0x1.4e53f2029ca7ep+0, 0x1.26207ba64c40fp+6, 0x1.38a7c40e714f9p+6, 0x1.75768e92eaed2p+4,
+0x1.0a442aa214885p+4, 0x1.39a25f927344cp+6, 0x1.dc7f3dd3b8fe8p+5, 0x1.49f310c693e62p+6,
+0x1.4e2f23829c5e4p+1, 0x1.808be35f0117cp+6, 0x1.10ba96aa21753p+5, 0x1.405e8e1a80bd2p+5,
+0x1.50aa3a62a1547p+3, 0x1.2175ca8242eb9p+3, 0x1.f93b0b03f2761p+1, 0x1.3b51035a76a2p+6,
+0x1.17fe7d622ffdp+3, 0x1.ae88da3b5d11bp+6, 0x1.be9778eb7d2efp+6, 0x1.c28002fb85p+6,
+0x1.bde712cb7bce2p+5, 0x1.d71cac2bae396p+5, 0x1.71fcb712e3f97p+6, 0x1.662acb1ecc559p+6,
+0x1.fa8cc8a3f5199p+3, 0x1.5c2d3b8ab85a7p+6, 0x1.14b9c74a29739p+6, 0x1.b5ac318f6b586p+6,
+0x1.b430477368609p+5, 0x1.2839a83250735p+6, 0x1.92b3792f2566fp+6, 0x1.bea2e7037d45dp+5,
+0x1.39688f5272d12p+4, 0x1.96b67a732d6cfp+5, 0x1.3caf172a795e3p+6, 0x1.21d65d0243accp+5,
+0x1.3f6732027ece6p+0, 0x1.5775b082aeeb6p+3, 0x1.dade3f47b5bc8p+6, 0x1.ede2bc83dbc58p+1,
+0x1.ab7a996f56f53p+6, 0x1.8cee2a6319dc5p+4, 0x1.5f3cb9eabe797p+5, 0x1.d58fe0bbab1fcp+6,
+0x1.0ed487d21da91p+5, 0x1.7ed06a9afda0dp+5, 0x1.10e0e41621c1dp+6, 0x1.54d4272aa9a85p+5,
+0x1.b7c43e136f888p+4, 0x1.9ef0b9fb3de17p+5, 0x1.b3a85a336750bp+4, 0x1.4ce498ea99c93p+6,
+0x1.bb06b313760d6p+6, 0x1.dee6cd9fbdcdap+6, 0x1.661ec812cc3d9p+5, 0x1.fa584c27f4b0ap+6,
+0x1.3b14092676281p+6, 0x1.c7c92b538f925p+6, 0x1.b0047db36009p+6, 0x1.52c2cdc2a585ap+2,
+0x1.e005a703c00b5p+5, 0x1.42b7f6de856ffp+6, 0x1.e8fb40c3d1f68p+5, 0x1.3e5cf75a7cb9fp+6,
+0x1.c266828384cdp+1, 0x1.8965bc4312cb8p+3, 0x1.cf4825db9e905p+6, 0x1.310d0e02621a2p+2,
+0x1.706db662e0db7p+4, 0x1.aa26651f544cdp+6, 0x1.13ff362227fe7p+3, 0x1.e581c203cb038p+0,
+0x1.ac3df683587bfp+1, 0x1.a43c877348791p+5, 0x1.dd25e7c3ba4bdp+6, 0x1.2998673a5330dp+5,
+0x1.91867907230cfp+6, 0x1.dc0d97abb81b3p+5, 0x1.3f3647327e6c9p+6, 0x1.ff77888bfeef1p+6,
+0x1.bd7f28d37afe5p+6, 0x1.ac205dbf5840cp+6, 0x1.4c5c217698b84p+6, 0x1.7885dbe2f10bbp+6,
+0x1.8b072b5b160e5p+6, 0x1.ff6b857ffed71p+6, 0x1.72de280ae5bc5p+6, 0x1.8c3668fb186cdp+5,
+0x1.c734b0cf8e696p+6, 0x1.22e2a5ba45c55p+6, 0x1.b68ec2bb6d1d8p+5, 0x1.6e6f089adcde1p+5,
+0x1.966a72632cd4ep+4, 0x1.cfc501bf9f8ap+6, 0x1.f5947ba7eb28fp+6, 0x1.ceb742b39d6e8p+4,
+0x1.e3728803c6e51p-3, 0x1.c4dca17f89b94p+6, 0x1.0d7d431a1afa8p+5, 0x1.74349b72e8693p+4,
+0x1.6f03069ade061p+6, 0x1.527d10aaa4fa2p+5, 0x1.928cb79325197p+4, 0x1.7c64f64ef8c9fp+6,
+0x1.7b5ccc0ef6b9ap+6, 0x1.072456a20e48bp+4, 0x1.13129e8226254p+2, 0x1.0ce3451619c69p+6,
+0x1.2fcfe17e5f9fcp+6, 0x1.5067711aa0ceep+6, 0x1.0c5acd9e18b5ap+6, 0x1.da9e14a3b53c3p+5,
+0x1.f90f9dabf21f4p+5, 0x1.62dbbc42c5b78p+4, 0x1.975398c32ea73p+4, 0x1.0f1df45a1e3bfp+5,
+0x1.6089d232c113ap+4, 0x1.d8b30e3bb1662p+6, 0x1.4daa2eae9b546p+6, 0x1.f5725583eae4bp+2,
+0x1.f72b67ebee56dp+5, 0x1.478c80428f19p+3, 0x1.ad1d53535a3aap+5, 0x1.6130508ec260ap+6,
+0x1.f8b691c7f16d2p+6, 0x1.98464a9b308c9p+5, 0x1.d4de213ba9bc4p+6, 0x1.f9a84b0bf3509p+6,
+0x1.21ff8d9a43ff2p+5, 0x1.6e730b22dce61p+4, 0x1.5ad5c792b5ab9p+4, 0x1.66b20002cd64p-9,
+0x1.04db4b1e09b69p+6, 0x1.76b13f9aed628p+5, 0x1.7c67c3b6f8cf8p+6, 0x1.00702e5200e06p+5,
+0x1.fa436aebf486dp+5, 0x1.8d98ed9f1b31ep+6, 0x1.8d1b5c3f1a36cp+6, 0x1.678cb782cf197p+3,
+0x1.bc00bd7378018p+5, 0x1.32ec53ba65d8ap+5, 0x1.1a40a14234814p+6, 0x1.da882d8fb5106p+6,
+0x1.e45a31dbc8b46p+5, 0x1.80158777002b1p+6, 0x1.885c9ef310b94p+4, 0x1.4a4f8d7e949f2p+6,
+0x1.58c895aeb1913p+6, 0x1.afc1566b5f82bp+6, 0x1.69a6b2d6d34d6p+6, 0x1.51792682a2f25p+4,
+0x1.d8b2e673b165dp+6, 0x1.00d571f201aaep+4, 0x1.b58e9a2f6b1d3p+6, 0x1.d1697837a2d2fp+6,
+0x1.0c5881ce18b1p+6, 0x1.8a6cbb6b14d97p+6, 0x1.cb11c33f96238p+6, 0x1.9d58489b3ab09p+6,
+0x1.e6097e33cc13p+6, 0x1.0e39a9021c735p+3, 0x1.9d5b15ff3ab63p+6, 0x1.d5c9929bab932p+5,
+0x1.ba3fa9db747f5p+5, 0x1.19c2d9b23385bp+6, 0x1.6b1ce076d639cp+6, 0x1.da418a63b4831p+6,
+0x1.4eb78ea29d6f2p+5, 0x1.f070796be0e0fp+5, 0x1.ccc855039990bp+0, 0x1.855c260b0ab85p+6,
+0x1.91ae6693235cdp+6, 0x1.2173c29642e78p+6, 0x1.5fe45396bfc8ap+6, 0x1.07b6fefa0f6ep+5,
+0x1.4312941286253p+5, 0x1.c1fb7b5383f6fp+6, 0x1.ce2b0cfb9c562p+6, 0x1.fa51dfbbf4a3cp+6,
+0x1.71bcd1bae379ap+6, 0x1.37d1bfd26fa38p+6, 0x1.3ac0a56275815p+4, 0x1.4a6fb82a94df7p+6,
+0x1.78071c4ef00e4p+6, 0x1.0fb0e2021f61cp+0, 0x1.1bd9305e37b26p+6, 0x1.08bf3c32117e8p+5,
+0x1.8eab7ef31d57p+6, 0x1.cdd5e7339babdp+5, 0x1.0dbf35821b7e7p+3, 0x1.74b4fd22e96ap+6,
+0x1.08b228be11645p+6, 0x1.bf12fcb37e26p+6, 0x1.7e6719b2fcce3p+4, 0x1.e5d1fdabcba4p+6,
+0x1.b1abacc363576p+5, 0x1.cab6a6e3956d5p+6, 0x1.c013880f80271p+6, 0x1.80319db300634p+6,
+0x1.85ddc72b0bbb9p+5, 0x1.c746a9638e8d5p+6, 0x1.058dc3ba0b1b8p+6, 0x1.52752892a4ea5p+4,
+0x1.d174d7eba2e9bp+5, 0x1.95c85d432b90cp+4, 0x1.b0f1934b61e32p+5, 0x1.8a43b60314877p+6,
+0x1.3b6c950276d93p+3, 0x1.4d47ad3a9a8f6p+5, 0x1.849595bb092b3p+6, 0x1.992a645f3254dp+6,
+0x1.de75966fbceb3p+6, 0x1.d345bf13a68b8p+6, 0x1.c734390b8e687p+5, 0x1.567cb2beacf96p+6,
+0x1.d784829baf09p+6, 0x1.ff734ce7fee6ap+6, 0x1.dadc50d7b5b8ap+6, 0x1.6630018acc6p+6,
+0x1.ccbc80fb9979p+5, 0x1.fc94378bf9287p+6, 0x1.b5c9fd536b94p+5, 0x1.ef10693bde20dp+6,
+0x1.bba7343b774e7p+6, 0x1.3a7ec51674fd9p+6, 0x1.d4e266e7a9c4dp+6, 0x1.28fa153251f43p+5,
+0x1.05356bfa0a6adp+6, 0x1.94f5eef329ebep+6, 0x1.4aea84c295d51p+2, 0x1.c8244f8f9048ap+6,
+0x1.5c3c9852b8793p+6, 0x1.1a3c6c063478ep+6, 0x1.cc199b4398333p+2, 0x1.13dc111227b82p+4,
+0x1.7fae8356ff5dp+6, 0x1.ea74c6b3d4e99p+5, 0x1.cf3aba479e757p+6, 0x1.a71c15fb4e383p+6,
+0x1.9bde39f737bc7p+6, 0x1.53d04ffea7a0ap+6, 0x1.40467a56808cfp+6, 0x1.7a53d066f4a7ap+6,
+0x1.27160f124e2c2p+6, 0x1.1f04b6c23e097p+3, 0x1.a1a1064343421p+5, 0x1.fd352353fa6a4p+5,
+0x1.1a9f1de2353e4p+3, 0x1.5759a7eaaeb35p+5, 0x1.932a4cd32654ap+4, 0x1.09b2243e13645p+6,
+0x1.508216faa1043p+5, 0x1.3faf91de7f5f2p+6, 0x1.f1851aebe30a3p+5, 0x1.8fa0fed31f42p+4,
+0x1.e8b95bd3d172bp+4, 0x1.9b49e8b33693dp+5, 0x1.f0ca94a3e1953p+5, 0x1.7f63c2eefec78p+6,
+0x1.8a6b8d2314d72p+4, 0x1.0d13f29e1a27ep+6, 0x1.4788127a8f102p+6, 0x1.bed77b9b7daefp+6,
+0x1.3a82f5027505fp+3, 0x1.6449ac2ec8936p+6, 0x1.e73ff003ce7fep-1, 0x1.a6fee1fb4dfdcp+6,
+0x1.66103e12cc208p+4, 0x1.d3093a27a6127p+6, 0x1.4e1af7f29c35fp+6, 0x1.f562497feac49p+6,
+0x1.26d98a264db31p+6, 0x1.1cc2e48a3985dp+5, 0x1.6fb619e2df6c3p+6, 0x1.37be64d26f7cdp+4,
+0x1.6484123ac9082p+5, 0x1.021a74020434fp+4, 0x1.4c8a2ade99145p+6, 0x1.ab2bd9bb5657bp+5,
+0x1.d866e1ebb0cdcp+5, 0x1.b154be1362a98p+6, 0x1.df48111bbe902p+6, 0x1.94747c7728e9p+6,
+0x1.e2089fe3c4114p+5, 0x1.b0153d1b602a8p+5, 0x1.f85cbc2bf0b98p+6, 0x1.6b32a6e6d6655p+6,
+0x1.a5af92eb4b5f2p+6, 0x1.e1840cf3c3082p+5, 0x1.d52cd3a3aa59ap+5, 0x1.094ec602129d9p+1,
+0x1.fdd5f917fbabfp+6, 0x1.90f3e24321e7cp+3, 0x1.c721f1cf8e43ep+6, 0x1.2932bdc252658p+3,
+0x1.9668287b2cd05p+6, 0x1.caf071af95e0ep+6, 0x1.cc2539b3984a7p+6, 0x1.efec37ffdfd87p+6,
+0x1.9df9abd33bf35p+6, 0x1.1a4031a234806p+6, 0x1.e54e817bca9dp+6, 0x1.89a66beb134cdp+5,
+0x1.a8a1a3e751434p+6, 0x1.55049b5aaa093p+6, 0x1.12c2cf2a2585ap+6, 0x1.6b8eb402d71d7p+4,
+0x1.958b385b2b167p+6, 0x1.7d33e822fa67dp+4, 0x1.307999de60f33p+6, 0x1.037d52a206faap+5,
+0x1.0a1b81821437p+2, 0x1.0fc1aaf61f835p+6, 0x1.63325c42c664cp+2, 0x1.01a6080a034c1p+6,
+0x1.e7cc4987cf989p+6, 0x1.d1fc3d83a3f88p+1, 0x1.b362bbb366c57p+4, 0x1.8d7bdc6f1af7cp+6,
+0x1.fea3d0d3fd47ap+5, 0x1.576f18beaede3p+6, 0x1.95c6529f2b8cap+6, 0x1.fa4fc2fbf49f8p+5,
+0x1.898d950b131b3p+6, 0x1.5ce8446ab9d09p+6, 0x1.224e3936449c7p+6, 0x1.1ff5bd823feb8p+6,
+0x1.27d8b6164fb17p+6, 0x1.dce6e5cbb9cddp+5, 0x1.0fe1f57e1fc3fp+6, 0x1.8ba4c3d317498p+5,
+0x1.167490822ce92p+1, 0x1.ea60edf3d4c1ep+5, 0x1.8aa597df154b3p+6, 0x1.b155486b62aa9p+6,
+0x1.28d4494251a89p+4, 0x1.3ad0ce1275a1ap+5, 0x1.871ead830e3d6p+1, 0x1.dfc04aafbf809p+6,
+0x1.f96ac223f2d58p+5, 0x1.3cb28f4a79652p+6, 0x1.85fbcff30bf7ap+4, 0x1.0d57192a1aae3p+6,
+0x1.31d0e90263a1dp+4, 0x1.dec86703bd90dp+4, 0x1.dfa42683bf485p+1, 0x1.a2041e2344084p+3,
+0x1.0c83f75a1907fp+5, 0x1.ef574083deae8p+4, 0x1.c1bc60338378cp+6, 0x1.8593e4170b27dp+6,
+0x1.d344e8e3a689dp+6, 0x1.5782b2ceaf056p+6, 0x1.05778b2a0aef1p+5, 0x1.5cd27deab9a5p+6,
+0x1.68d5ee72d1abep+5, 0x1.a509fecb4a14p+6, 0x1.f320eda3e641ep+4, 0x1.dc43ad4fb8876p+6,
+0x1.26fae3624df5cp+5, 0x1.8caa30e719546p+6, 0x1.442c1e6a88584p+5, 0x1.38622c6a70c46p+5,
+0x1.03b54fba076aap+5, 0x1.65dd38a2cbba7p+3, 0x1.36197a826c32fp+4, 0x1.981f7463303efp+5,
+0x1.94481c3b28904p+5, 0x1.66fd5032cdfaap+4, 0x1.57a009baaf401p+5, 0x1.c6d96f2f8db2ep+6,
+0x1.9671e3572ce3cp+6, 0x1.0d4ef8da1a9dfp+6, 0x1.a86110ab50c22p+5, 0x1.e2e61d97c5cc4p+6,
+0x1.8501129b0a022p+6, 0x1.c65b53138cb6ap+5, 0x1.726a1582e4d43p+2, 0x1.6861c882d0c39p+1,
+0x1.5f0379aebe06fp+6, 0x1.d8e3018bb1c6p+6, 0x1.90d6f25f21adep+6, 0x1.3248628e6490cp+6,
+0x1.3065b45a60cb7p+6, 0x1.392b7f027257p+2, 0x1.1e35c0ea3c6b8p+5, 0x1.e4d0ab93c9a15p+6,
+0x1.b89cb6bb71397p+6, 0x1.0be31bde17c63p+6, 0x1.c11458df8228bp+6, 0x1.3068a1a260d14p+4,
+0x1.311a998262353p+5, 0x1.8ca9a05319534p+4, 0x1.d0967d43a12dp+5, 0x1.1a67f4a234cffp+6,
+0x1.1fcc1e523f984p+5, 0x1.35d19d426ba34p+6, 0x1.e677aed3ccef6p+6, 0x1.5a0a1d46b4144p+6,
+0x1.8f90f14f1f21ep+6, 0x1.248f675a491edp+5, 0x1.20e38c7241c72p+6, 0x1.2602d4a24c05bp+6,
+0x1.9f96ac873f2d6p+6, 0x1.f51414c7ea283p+6, 0x1.08e8f23a11d1ep+6, 0x1.2497bf1e492f8p+6,
+0x1.b0837ca36107p+5, 0x1.200f9392401f2p+6, 0x1.2fdacd625fb5ap+6, 0x1.ba29bfe374538p+3,
+0x1.f1e52a3be3ca5p+5, 0x1.81637f7b02c7p+5, 0x1.698d9a8ad31b3p+6, 0x1.4ac24ba295849p+3,
+0x1.a888ef5b5111ep+5, 0x1.f8a87afff150fp+6, 0x1.c51ea0838a3d4p+1, 0x1.19c25cd23384cp+5,
+0x1.048b96da09173p+6, 0x1.cf3d4de39e7aap+6, 0x1.b1f6ada363ed6p+5, 0x1.9d18e39b3a31cp+6,
+0x1.933dafa3267b6p+3, 0x1.c1469573828d3p+6, 0x1.6f01b072de036p+5, 0x1.849b8a3b09371p+5,
+0x1.ee306563dc60dp+5, 0x1.3bf10e1277e22p+5, 0x1.c57e26038afc5p+2, 0x1.0d5247fa1aa49p+5,
+0x1.30403ab660807p+6, 0x1.3d3b6ed27a76ep+6, 0x1.acabf8a35957fp+6, 0x1.9fadce733f5bap+5,
+0x1.324f839a649fp+6, 0x1.6b29d5b2d653bp+5, 0x1.f46ea657e8dd5p+6, 0x1.52283d02a4508p+1,
+0x1.d5a47e6bab49p+6, 0x1.244973ba4892ep+6, 0x1.0759e7920eb3dp+4, 0x1.9d2e270b3a5c5p+5,
+0x1.e4fb3377c9f66p+6, 0x1.ab64146f56c83p+6, 0x1.efdeb9f3dfbd7p+5, 0x1.727f564ae4febp+5,
+0x1.a40c8f6b48192p+6, 0x1.061851fe0c30ap+6, 0x1.4620d98e8c41bp+6, 0x1.51304c82a260ap+5,
+0x1.aaab3fc355568p+5, 0x1.f1c305c3e3861p+2, 0x1.16c427622d885p+4, 0x1.07bd55d60f7abp+6,
+0x1.e062c5d3c0c59p+6, 0x1.fa63c42bf4c79p+5, 0x1.ca0b1af794163p+6, 0x1.aef5f1035debep+5,
+0x1.9b2a691f3654dp+6, 0x1.e662fd57ccc6p+6, 0x1.5e241c82bc484p+6, 0x1.96d547ab2daa9p+5,
+0x1.239e6c2a473cep+6, 0x1.0ad0152215a03p+6, 0x1.9b418b0f36831p+6, 0x1.57b7bf02af6f8p+4,
+0x1.c064fffb80cap+6, 0x1.8fb031671f606p+6, 0x1.81fcc6a303f99p+4, 0x1.96097e632c13p+6,
+0x1.67f34a3acfe69p+5, 0x1.44ab571a8956bp+5, 0x1.928247a325049p+4, 0x1.31e9b12263d36p+5,
+0x1.36e6ffe26dcep+4, 0x1.5c8feee2b91fep+6, 0x1.523483b6a469p+6, 0x1.f1c64f63e38cap+6,
+0x1.8aa103831542p+4, 0x1.30aaba8261557p+5, 0x1.34bceb426979dp+5, 0x1.37fde0c26ffbcp+6,
+0x1.6ee31b42ddc63p+5, 0x1.c01efef3803ep+5, 0x1.fdd9b4a3fbb37p+3, 0x1.2fa8a6e25f515p+5,
+0x1.dd41618fba82cp+6, 0x1.38ca310271946p+1, 0x1.6f4f4bf2de9e9p+6, 0x1.786bcaaef0d79p+6,
+0x1.f0294ee3e052ap+6, 0x1.9ae6d0e335cdap+5, 0x1.0f59ba021eb37p+4, 0x1.13c7bb0a278f7p+6,
+0x1.d8437d93b087p+6, 0x1.df17f98fbe2ffp+6, 0x1.69b5aacad36b5p+6, 0x1.98a87d8b3151p+6,
+0x1.6ec82af2dd905p+6, 0x1.ca34dc739469cp+6, 0x1.2eb1fbee5d63fp+6, 0x1.160e80622c1dp+3,
+0x1.b22a1ff364544p+4, 0x1.93528dd726a52p+6, 0x1.776d5142eedaap+5, 0x1.74888feae9112p+5,
+0x1.dfc4f96bbf89fp+5, 0x1.bd658a837acb1p+1, 0x1.58152eaab02a6p+5, 0x1.528abd96a5158p+6,
+0x1.4c81133299022p+5, 0x1.46690cf68cd22p+6, 0x1.15113caa2a228p+5, 0x1.5db2173abb643p+6,
+0x1.33c463626788cp+3, 0x1.9487a9db290f5p+5, 0x1.f5866aabeb0cdp+6, 0x1.dcf6fe03b9eep-1,
+0x1.a8144ceb5028ap+5, 0x1.64d5b69ac9ab7p+6, 0x1.7c25b8aaf84b7p+6, 0x1.8866eaab10cddp+5,
+0x1.9248f8632491fp+3, 0x1.bffc272b7ff85p+6, 0x1.d7fb305faff66p+6, 0x1.51939382a3272p+1,
+0x1.9f1420b73e284p+6, 0x1.41b0db268361bp+6, 0x1.a3351a2b466a3p+6, 0x1.0ddc4baa1bb89p+6,
+0x1.0be5b79617cb7p+6, 0x1.a3ce2c2b479c6p+5, 0x1.309e1bb6613c3p+6, 0x1.78703f92f0e08p+6,
+0x1.94e68fa329cd2p+4, 0x1.ec54c457d8a99p+6, 0x1.95a43c232b488p+3, 0x1.551c209eaa384p+6,
+0x1.fa3ff0aff47fep+6, 0x1.bd7e3db37afc8p+5, 0x1.4f4dbc6a9e9b8p+5, 0x1.4100f48a8201fp+5,
+0x1.29415e625282cp+3, 0x1.322f7c8a645fp+6, 0x1.fe32917ffc652p+6, 0x1.2e82e0f25d05cp+4,
+0x1.fc735177f8e6ap+6, 0x1.f3b8fc27e772p+6, 0x1.3d6a98e27ad53p+4, 0x1.a0faefdb41f5ep+5,
+0x1.588eb2beb11d6p+6, 0x1.cb805ee39700cp+6, 0x1.94b0ed432961ep+6, 0x1.8ad7d1cb15afap+6,
+0x1.8b7c860b16f91p+6, 0x1.6cac1da2d9584p+6, 0x1.95646e6b2ac8ep+6, 0x1.2a90a6be55215p+6,
+0x1.5cb9f18ab973ep+5, 0x1.3899889271331p+6, 0x1.c367932386cf2p+3, 0x1.ba42b05f74856p+6,
+0x1.5013d482a027bp+1, 0x1.690b0e1ed2162p+6, 0x1.32b2efee6565ep+6, 0x1.bee90a337dd21p+4,
+0x1.555fd272aabfap+6, 0x1.65677776cacefp+6, 0x1.c4d6632b89accp+6, 0x1.4f9fc31e9f3f8p+6,
+0x1.109a59322134bp+4, 0x1.b1f5057363ea1p+4, 0x1.f0203d63e0408p+6, 0x1.a53b08734a761p+4,
+0x1.9eacbdeb3d598p+6, 0x1.ee52cedfdca5ap+6, 0x1.69def4b2d3bdfp+5, 0x1.9b200f5f36402p+6,
+0x1.e20bcb03c4179p+6, 0x1.044a209208944p+6, 0x1.ae761d235cec4p+4, 0x1.3a9a7dc27535p+6,
+0x1.9f94fee33f2ap+5, 0x1.39d2300273a46p-4, 0x1.8ae49f1315c94p+5, 0x1.6d1c15e2da383p+4,
+0x1.6cfa922ed9f52p+6, 0x1.6b5af7c2d6b5fp+4, 0x1.85d7ac370baf6p+6, 0x1.b578af036af16p+2,
+0x1.9370468326e09p+6, 0x1.be449e9f7c894p+6, 0x1.d59a3b4fab347p+6, 0x1.9df0e5273be1dp+6,
+0x1.274facba4e9f6p+6, 0x1.084d2b3e109a5p+6, 0x1.b564f6036ac9fp+1, 0x1.f2bdfca3e57cp+4,
+0x1.b6d28ac36da51p+4, 0x1.d2818adfa5031p+6, 0x1.cc4f424b989e8p+6, 0x1.63b671fac76cep+5,
+0x1.f7f661c3efeccp+3, 0x1.bc6f7fab78dfp+6, 0x1.1b29fb1a3653fp+6, 0x1.ddab8a23bb571p+6,
+0x1.aac24e8b5584ap+6, 0x1.d0197573a032fp+6, 0x1.78cb9982f1973p+6, 0x1.8cce198b199c3p+6,
+0x1.a8c72c03518e6p+5, 0x1.e46920cbc8d24p+6, 0x1.8ed12e931da26p+5, 0x1.a42e1573485c3p+6,
+0x1.e4b79557c96f3p+6, 0x1.8cdae6d719b5dp+6, 0x1.ff751aebfeea3p+6, 0x1.51b22782a3645p+6,
+0x1.e7b1a4c7cf635p+6, 0x1.854cc7230a999p+6, 0x1.6d09b276da136p+6, 0x1.7b21eb4af643dp+6,
+0x1.439165be8722dp+6, 0x1.42a3edc28547ep+6, 0x1.1912d06e3225ap+6, 0x1.ab8449d357089p+4,
+0x1.2bc463f25788cp+4, 0x1.26bdf8224d7bfp+6, 0x1.cf21233b9e424p+5, 0x1.714b775ae296fp+5,
+0x1.f27f05fbe4fe1p+5, 0x1.67bfa7cacf7f5p+5, 0x1.6a80f4aed501fp+6, 0x1.383e4f36707cap+6,
+0x1.c13d4e43827aap+4, 0x1.0b55df8a16abcp+5, 0x1.15e9d95a2bd3bp+6, 0x1.b11a218362344p+2,
+0x1.571194e2ae233p+4, 0x1.1d6ae5b23ad5dp+5, 0x1.a7dfbba34fbf7p+6, 0x1.2a27fb3a544ffp+6,
+0x1.cc7a4e8398f4ap+4, 0x1.bd214bb37a429p+4, 0x1.9cac215b39584p+5, 0x1.5f58a3e2beb14p+4,
+0x1.fc2339c3f8467p+6, 0x1.9b96572b372cbp+5, 0x1.a988507b5310ap+6, 0x1.e3d4de87c7a9cp+6,
+0x1.4c5fcad298bf9p+4, 0x1.169202ee2d24p+6, 0x1.5ef6c9cebded9p+6, 0x1.96a958732d52bp+6,
+0x1.64d7c2c2c9af8p+4, 0x1.e02668f3c04cdp+4, 0x1.8a6ae40314d5dp-2, 0x1.484e135a909c2p+5,
+0x1.9ec7925f3d8f2p+6, 0x1.d235f90ba46bfp+5, 0x1.5cccc55eb9999p+6, 0x1.300e2ab2601c5p+5,
+0x1.9cfad06b39f5ap+6, 0x1.8e9b74131d36fp+5, 0x1.d045648fa08adp+6, 0x1.a9447f035289p+1,
+0x1.4cf8a9ce99f15p+6, 0x1.cc5e7bcb98bcfp+5, 0x1.42de308285bc6p+3, 0x1.a2bd0f07457a2p+6,
+0x1.74e4b0bee9c96p+6, 0x1.d03b81b7a077p+6, 0x1.99ca148333943p+5, 0x1.e8034463d0069p+6,
+0x1.fc1ea503f83d5p+3, 0x1.9b3b1aef36763p+6, 0x1.fecb6ac3fd96dp+3, 0x1.dd387303ba70ep+3,
+0x1.a4191a0348323p+4, 0x1.e961bdd3d2c38p+6, 0x1.f7bece43ef7dap+2, 0x1.783c7272f078ep+5,
+0x1.ffe78183ffcfp+5, 0x1.7e72b6b6fce57p+6, 0x1.4b1e46a2963c9p+4, 0x1.5929b172b2536p+6,
+0x1.f67c50f3ecf8ap+6, 0x1.5147f242a28fep+4, 0x1.fd50bb1ffaa17p+6, 0x1.9543e34f2a87cp+6,
+0x1.3d6cf9167ad9fp+6, 0x1.5a1d807ab43bp+6, 0x1.6a57c522d4af9p+3, 0x1.b4cf92fb699f2p+5,
+0x1.0b59d40216b3bp+3, 0x1.fd905d33fb20cp+6, 0x1.cf63daf39ec7bp+5, 0x1.6e63e452dcc7dp+6,
+0x1.c77f36338efe7p+5, 0x1.100db38a201b6p+6, 0x1.1120f3562241ep+6, 0x1.62912f52c5226p+4,
+0x1.c0926a7b8124dp+5, 0x1.de05fd97bc0cp+6, 0x1.029e40d2053c8p+4, 0x1.1fcd09de3f9a1p+6,
+0x1.79411882f2823p+6, 0x1.0101fb1a0203fp+5, 0x1.5b74183eb6e83p+6, 0x1.e2475f07c48ecp+6,
+0x1.a78aed834f15ep+4, 0x1.7af00526f5e01p+6, 0x1.3ccb307a79966p+5, 0x1.69d67c22d3adp+6,
+0x1.f2c577b3e58afp+5, 0x1.e25a53cbc4b4ap+5, 0x1.86005b230c00bp+5, 0x1.dfbe1993bf7c3p+5,
+0x1.457f26768afe5p+6, 0x1.80a1d15b0143ap+5, 0x1.0a45e02a148bcp+5, 0x1.05d83f120bb08p+5,
+0x1.a6e692834dcd2p+2, 0x1.64dbd172c9b7ap+5, 0x1.5d53e90abaa7dp+6, 0x1.decd1d43bd9a4p+3,
+0x1.5ffc8bd2bff91p+5, 0x1.14175a02282ebp+4, 0x1.aa3d87fb547b1p+6, 0x1.93bde103277bcp+6,
+0x1.55138a0aaa271p+6, 0x1.76bcf6a2ed79fp+5, 0x1.ec622cdbd8c46p+6, 0x1.aae5fa4355cbfp+3,
+0x1.32c8f1ca6591ep+5, 0x1.684de862d09bdp+3, 0x1.5529c926aa539p+6, 0x1.2a59168254b23p+2,
+0x1.5b15753ab62afp+5, 0x1.613bc2cac2778p+5, 0x1.f4ecf06fe9d9ep+6, 0x1.176d75fe2edafp+6,
+0x1.5c6f3442b8de7p+3, 0x1.26a511524d4a2p+5, 0x1.0287e43a050fdp+5, 0x1.24f0a26249e14p+6,
+0x1.847fb28f08ff6p+6, 0x1.44441fae88884p+6, 0x1.4cfaf28299f5ep+2, 0x1.93fdb20b27fb6p+5,
+0x1.254216024a843p+0, 0x1.33e53e7a67ca8p+5, 0x1.4ceaf88e99d5fp+6, 0x1.f0371803e06e3p+2,
+0x1.4c6087f698c11p+6, 0x1.547dc32aa8fb8p+5, 0x1.6b7454b2d6e8bp+4, 0x1.fc5ecddff8bdap+6,
+0x1.de89702bbd12ep+5, 0x1.46a749028d4e9p+0, 0x1.901caee320396p+6, 0x1.1161088222c21p+4,
+0x1.80f230eb01e46p+5, 0x1.7c7edbbaf8fdbp+6, 0x1.e6d405a3cda81p+4, 0x1.59dd915eb3bb2p+6,
+0x1.a98898c753113p+6, 0x1.cedeca8f9dbd9p+6, 0x1.6c8322c6d9064p+6, 0x1.5c4d4d82b89aap+4,
+0x1.fdf2afc3fbe56p+4, 0x1.61701332c2e02p+6, 0x1.6e80c95edd019p+6, 0x1.561524f2ac2a5p+5,
+0x1.f4c29bdbe9853p+6, 0x1.efc4bb7bdf897p+6, 0x1.cffb34db9ff67p+6, 0x1.79424e66f284ap+6,
+0x1.3408db266811bp+6, 0x1.e4cae403c995dp+6, 0x1.0d049da21a094p+4, 0x1.389de382713bcp+6,
+0x1.faf60cf3f5ec2p+4, 0x1.902c1ffb20584p+6, 0x1.57a15502af42bp+6, 0x1.cb1e0b33963c1p+6,
+0x1.d3580c63a6b02p+3, 0x1.b27e6a2f64fcdp+6, 0x1.c77cd9138ef9bp+6, 0x1.29afb9a6535f7p+6,
+0x1.b79907576f321p+6, 0x1.579987f2af331p+6, 0x1.6e07fbc6dc0ffp+6, 0x1.e0487f23c091p+4,
+0x1.a830c75350619p+5, 0x1.e7bcfd2fcf7ap+6, 0x1.d1efb127a3df6p+6, 0x1.f683f1b3ed07ep+4,
+0x1.b69bc7bb6d379p+6, 0x1.3e72d3ea7ce5ap+6, 0x1.a9689fa352d14p+5, 0x1.b0c39d6361874p+3,
+0x1.3fc5ce327f8bap+5, 0x1.0cd464b219a8dp+4, 0x1.c2460c4b848c2p+5, 0x1.294b05e252961p+5,
+0x1.97cea5432f9d5p+3, 0x1.623c7602c478fp+5, 0x1.bcfa2b0379f45p+1, 0x1.6702afcece056p+6,
+0x1.2bd23e0257a48p+5, 0x1.44a3e3028947cp+4, 0x1.3f41269a7e825p+5, 0x1.14a6a242294d4p+6,
+0x1.e15518bbc2aa3p+6, 0x1.f741e853ee83dp+6, 0x1.bf895ae37f12bp+5, 0x1.bc01a48378035p+2,
+0x1.a9c0527f5380ap+6, 0x1.4e830d029d062p+5, 0x1.456fd3ee8adfap+6, 0x1.615959d2c2b2bp+6,
+0x1.fedb0e73fdb62p+6, 0x1.66ef9f62cddf4p+5, 0x1.d96b799fb2d6fp+6, 0x1.a5e6e4334bcddp+5,
+0x1.366999ba6cd33p+5, 0x1.ab5b2ac356b65p+6, 0x1.50946e8aa128ep+6, 0x1.474252528e84ap+4,
+0x1.d39bfd5ba738p+5, 0x1.2a45f2c2548bep+3, 0x1.0fd210821fa42p+5, 0x1.89b0e5c71361dp+6,
+0x1.a1f75e1343eecp+4, 0x1.690c0e6ad2182p+6, 0x1.e5668b83cacd1p+2, 0x1.36ef585a6ddebp+5,
+0x1.a2a4968345493p+2, 0x1.61f1d082c3e3ap+3, 0x1.3d2dfe027a5cp-1, 0x1.6026d0d2c04dap+5,
+0x1.f59ccb43eb399p+4, 0x1.4435de92886bcp+5, 0x1.c4ba0aab89741p+6, 0x1.7af12e32f5e26p+4,
+0x1.32b9af3265736p+5, 0x1.48fd703a91faep+5, 0x1.e9f19753d3e33p+4, 0x1.0c74a86218e95p+4,
+0x1.4bc03e9e97808p+6, 0x1.bfec39c37fd87p+6, 0x1.a47683eb48edp+6, 0x1.4a9b4d129536ap+6,
+0x1.cd9025c39b205p+4, 0x1.7de1fd86fbc4p+6, 0x1.d8ebf283b1d7ep+2, 0x1.0e98d64e1d31bp+6,
+0x1.293d284a527a5p+6, 0x1.6e232db2dc466p+6, 0x1.60696ae2c0d2dp+6, 0x1.30b26f426164ep+2,
+0x1.936bec0b26d7ep+6, 0x1.e8527327d0a4ep+6, 0x1.9cbc0cbb39782p+6, 0x1.fbe9c393f7d38p+6,
+0x1.515e818ea2bdp+6, 0x1.bb1275737624fp+6, 0x1.2ec2df7a5d85cp+5, 0x1.6b88caf6d7119p+6,
+0x1.e750af83cea16p+6, 0x1.33b79772676f3p+5, 0x1.b9c335c373867p+2, 0x1.92df895325bf1p+4,
+0x1.3bf6bb0677ed7p+6, 0x1.e0563e0bc0ac8p+6, 0x1.86e85bc30dd0bp+5, 0x1.d553929faaa72p+6,
+0x1.09a9ec4a1353ep+5, 0x1.3df093b67be12p+6, 0x1.870bcb430e179p+2, 0x1.d09534c3a12a7p+6,
+0x1.fbb99aebf7733p+5, 0x1.bce740a379ce8p+6, 0x1.1b3081d23661p+6, 0x1.7140d6e6e281bp+6,
+0x1.3ac93e2675928p+6, 0x1.38bf40fe717e8p+6, 0x1.ff66b4c3fecd7p+4, 0x1.901999b320333p+4,
+0x1.4dc4dd5a9b89cp+5, 0x1.e0431813c0863p+6, 0x1.dc463583b88c7p+4, 0x1.d272d5c3a4e5bp+3,
+0x1.c8958b37912b1p+6, 0x1.3cd9a1c279b34p+2, 0x1.b1c0f2436381ep+3, 0x1.19f40cc233e82p+6,
+0x1.cee00f8f9dc02p+6, 0x1.9b331c0b36664p+5, 0x1.0af9af6a15f36p+5, 0x1.b630bf136c618p+6,
+0x1.677559c2ceeabp+6, 0x1.4232162a84643p+5, 0x1.ae8a16435d143p+2, 0x1.46d8298a8db05p+5,
+0x1.02de923a05bd2p+5, 0x1.bcb99e8b79734p+5, 0x1.e2fe9d83c5fd4p+4, 0x1.06443f420c888p+6,
+0x1.c4d62f8389ac6p+2, 0x1.2260c83244c19p+5, 0x1.adb2e8035b65dp+5, 0x1.1a2a306e34546p+6,
+0x1.385e92e270bd2p+4, 0x1.f209f5d7e413fp+6, 0x1.16d60ea22dac2p+5, 0x1.88e0e2df11c1cp+6,
+0x1.2ac936d255927p+6, 0x1.0b44b48216897p+6, 0x1.ece7494fd9ce9p+6, 0x1.d1aba57fa3575p+6,
+0x1.d70f9923ae1f3p+5, 0x1.8fe35ab31fc6bp+4, 0x1.7f400682fe801p+1, 0x1.683aaf92d0756p+5,
+0x1.df19c323be338p+4, 0x1.08c879f21190fp+4, 0x1.ce11648b9c22dp+6, 0x1.1a9a01623534p+4,
+0x1.0fcbac861f976p+6, 0x1.4e38f1029c71ep+4, 0x1.fcd73f6bf9ae8p+6, 0x1.dd041913ba083p+4,
+0x1.e94e8eabd29d2p+5, 0x1.7bfe0cc2f7fc2p+2, 0x1.1aad1b0a355a3p+6, 0x1.76169072ec2d2p+6,
+0x1.ec396023d872cp+5, 0x1.936cc26b26d98p+6, 0x1.f16b3ec3e2d68p+4, 0x1.126a130a24d42p+6,
+0x1.24e9340249d27p+3, 0x1.533443b2a6688p+6, 0x1.64a21ba2c9443p+3, 0x1.cad32ce395a66p+4,
+0x1.453e39868a7c7p+6, 0x1.6ffe958adffd3p+5, 0x1.fb95ae1bf72b6p+6, 0x1.c01dc153803b8p+4,
+0x1.c343ff478688p+6, 0x1.e87cf767d0f9fp+6, 0x1.06cc57520d98bp+4, 0x1.5d9797aabb2f3p+5,
+0x1.31d7384263ae7p+4, 0x1.36b458226d68bp+4, 0x1.62e9239ec5d24p+6, 0x1.88787dbb10f1p+5,
+0x1.1fbe69123f7cdp+5, 0x1.30fa882a61f51p+6, 0x1.0ae2bf3615c58p+6, 0x1.9faae10f3f55cp+6,
+0x1.8488c46b09119p+6, 0x1.07b9fe9e0f74p+6, 0x1.6ebe7502dd7cfp+2, 0x1.e4c02ef3c9806p+4,
+0x1.1f79df6a3ef3cp+6, 0x1.3199025a6332p+6, 0x1.ef469c2fde8d4p+6, 0x1.5968f782b2d1fp+2,
+0x1.8a0b898314171p+5, 0x1.ae85af735d0b6p+4, 0x1.2800a28250014p+6, 0x1.d345d68ba68bbp+5,
+0x1.bed5af8f7dab6p+6, 0x1.5494e5f6a929dp+6, 0x1.5c57b67eb8af7p+6, 0x1.0413e9160827dp+6,
+0x1.92861703250c3p+1, 0x1.57ed6496afdadp+6, 0x1.741b596ae836bp+6, 0x1.cfd82fff9fb06p+6,
+0x1.406a5bfa80d4bp+6, 0x1.b5ce6f3f6b9cep+6, 0x1.fa8fef43f51fep+4, 0x1.8ce02a0f19c05p+6,
+0x1.bdc2a4037b855p-1, 0x1.e18d1f73c31a4p+6, 0x1.4471a3a288e34p+4, 0x1.26b573a24d6aep+5,
+0x1.1287a79a250f5p+6, 0x1.5bff281eb7fe5p+6, 0x1.982cd6e33059bp+3, 0x1.2e20d8025c41bp+5,
+0x1.8ee49ae31dc93p+4, 0x1.27c608b24f8c1p+4, 0x1.104077be2080fp+6, 0x1.8333062306661p+6,
+0x1.7b8a8486f7151p+6, 0x1.ff0e27d3fe1c5p+5, 0x1.98c9959b31933p+6, 0x1.0241251204825p+4,
+0x1.6b287fc6d651p+6, 0x1.819470330328ep+5, 0x1.2a33348a54667p+6, 0x1.29fe2f5253fc6p+6,
+0x1.55f1e0c2abe3cp+2, 0x1.0d15d6121a2bbp+5, 0x1.7090c322e1218p+3, 0x1.0f9a76221f34fp+3,
+0x1.de784f9fbcf0ap+6, 0x1.a22d71d3445aep+6, 0x1.f1cb7ec3e397p+6, 0x1.1ee2ab9a3dc55p+6,
+0x1.57fbe10eaff7cp+6, 0x1.c1bdea43837bdp+4, 0x1.5785ab4aaf0b5p+5, 0x1.5b776656b6eedp+6,
+0x1.47f268028fe4dp+4, 0x1.f9be7d1bf37dp+5, 0x1.eed22027dda44p+6, 0x1.6484419ac9088p+6,
+0x1.63799aa2c6f33p+4, 0x1.0ebdd8021d7bbp+3, 0x1.fb94ad9bf7296p+6, 0x1.792f1ac2f25e3p+5,
+0x1.af24f4b35e49fp+4, 0x1.0bd5255617aa5p+6, 0x1.fe549c03fca94p+3, 0x1.e753c1b3cea78p+6,
+0x1.6b872782d70e5p+1, 0x1.d894291bb1285p+6, 0x1.3f2057c27e40bp+3, 0x1.7684b902ed097p+6,
+0x1.32bcc26265798p+5, 0x1.52173f82a42e8p+6, 0x1.4105d0aa820bap+5, 0x1.5d7afe7abaf6p+5,
+0x1.d8a22a8bb1445p+6, 0x1.9d2a01733a54p+5, 0x1.a1619c0342c34p+5, 0x1.b71a7a2b6e34fp+6,
+0x1.c309ca2386139p+4, 0x1.84f8998309f13p+5, 0x1.abfa4b8357f49p+5, 0x1.c8be539b917cap+6,
+0x1.32ebc75265d79p+6, 0x1.81bffb67037ffp+6, 0x1.2435b9ee486b7p+6, 0x1.84e8615709d0cp+6,
+0x1.fa7ce7c3f4f9dp+4, 0x1.1307da16260fbp+6, 0x1.d2d945dba5b29p+5, 0x1.aefb41335df68p+5,
+0x1.34df951669bf3p+6, 0x1.ca02a11394054p+5, 0x1.94152dfb282a6p+6, 0x1.a0a8d2474151ap+6,
+0x1.f0d675dfe1acfp+6, 0x1.d3dfc17ba7bf8p+6, 0x1.87fc93f70ff92p+6, 0x1.fc32af1ff8656p+6,
+0x1.ac73ea9358e7dp+6, 0x1.afe09eef5fc14p+6, 0x1.72b7681ee56edp+6, 0x1.17492f022e926p+4,
+0x1.01f7de7203efcp+6, 0x1.33a50702674a1p+2, 0x1.e91f95fbd23f3p+5, 0x1.b53411f36a682p+5,
+0x1.c39ea25b873d4p+5, 0x1.c54098ff8a813p+6, 0x1.2369064246d21p+5, 0x1.5291c3b6a5238p+6,
+0x1.0f79cb7a1ef39p+5, 0x1.67b1a8e2cf635p+6, 0x1.1b50174e36a03p+6, 0x1.baa8ad0f75516p+6,
+0x1.d2e3488ba5c69p+5, 0x1.fc2e89e3f85d1p+3, 0x1.3f910e627f222p+6, 0x1.6810de36d021cp+6,
+0x1.528dab52a51b5p+6, 0x1.47ed8a828fdb1p+3, 0x1.fc73f663f8e7fp+3, 0x1.0eda80ca1db5p+5,
+0x1.0dff01da1bfep+6, 0x1.d3a3acc7a7476p+6, 0x1.40b0954281613p+3, 0x1.fdaaef6bfb55ep+5,
+0x1.a7836e3f4f06ep+6, 0x1.b012a6a360255p+6, 0x1.f6104da3ec20ap+5, 0x1.53f758cea7eebp+6,
+0x1.5ff3458ebfe69p+6, 0x1.b6fe3bc36dfc7p+4, 0x1.99c9a48f33935p+6, 0x1.87ac8ff30f592p+4,
+0x1.01f3bec203e78p+5, 0x1.1cb2df123965cp+5, 0x1.3c852cfa790a6p+6, 0x1.62c9308ec5926p+6,
+0x1.4e6822129cd04p+4, 0x1.ce39b01b9c736p+6, 0x1.6ab5e88ad56bdp+5, 0x1.b6addc836d5bcp+5,
+0x1.35eb58fe6bd6bp+6, 0x1.d0ab0b93a1561p+6, 0x1.2bff36a257fe7p+5, 0x1.f5cfd403eb9fbp+2,
+0x1.030dccc2061bap+2, 0x1.d590a9b3ab215p+6, 0x1.876ddb7b0edbbp+6, 0x1.62be881ec57d1p+6,
+0x1.fe8e5b03fd1cbp+6, 0x1.c6fc5a478df8bp+6, 0x1.ea2bc887d4579p+6, 0x1.0c8d5cda191acp+6,
+0x1.9aa0070f35401p+6, 0x1.241db2c2483b6p+2, 0x1.6c5a9202d8b52p+1, 0x1.4223754a8446fp+6,
+0x1.c25481cf84a9p+6, 0x1.066afb620cd5fp+6, 0x1.2c359c32586b4p+5, 0x1.2247c75e448f9p+6,
+0x1.742a8a52e8551p+6, 0x1.7f239522fe473p+3, 0x1.8432eb5b0865dp+6, 0x1.f52469b7ea48dp+6,
+0x1.7c7bc462f8f79p+5, 0x1.817030a302e06p+5, 0x1.57ed9a42afdb3p+6, 0x1.11d7eab623afdp+6,
+0x1.1de390da3bc72p+5, 0x1.a911d0835223ap+1, 0x1.ed2ed8fbda5dbp+6, 0x1.c4dd216b89ba4p+6,
+0x1.ddf39a1bbbe73p+6, 0x1.065ce8920cb9dp+5, 0x1.e43a1eabc8744p+6, 0x1.ee2476e7dc48fp+6,
+0x1.62fc77e2c5f8fp+4, 0x1.6ba7fa22d74ffp+6, 0x1.50e2ff06a1c6p+6, 0x1.5d35e3f2ba6bcp+4,
+0x1.32a4546a6548bp+6, 0x1.3b0ec78a761d9p+6, 0x1.63dad5d6c7b5bp+6, 0x1.9a88b6eb35117p+5,
+0x1.4d50a2b69aa14p+6, 0x1.6f3daa66de7b5p+6, 0x1.ecfa1783d9f43p+1, 0x1.0fa524861f4a5p+6,
+0x1.d6a29723ad453p+4, 0x1.4b053daa960a8p+5, 0x1.8f675f031ececp+3, 0x1.e9d3301bd3a66p+6,
+0x1.aace22fb559c4p+5, 0x1.b61fd73b6c3fbp+6, 0x1.def799cfbdef3p+6, 0x1.93a4f3af2749ep+6,
+0x1.db5fbe33b6bf8p+4, 0x1.36e534126dca7p+6, 0x1.4af9bcc295f38p+5, 0x1.05c9b7fa0b937p+6,
+0x1.442dc296885b8p+6, 0x1.25576eb24aaeep+5, 0x1.954db2c32a9b6p+5, 0x1.22215cae4442cp+6,
+0x1.15da2ba22bb45p+6, 0x1.5dc1f012bb83ep+5, 0x1.1045d396208bap+6, 0x1.6e99499edd329p+6,
+0x1.a88f22c3511e4p+2, 0x1.84a34a6309469p+4, 0x1.c5e6c29b8bcd8p+6, 0x1.4d2d46969a5a9p+6,
+0x1.9c379a23386f3p+6, 0x1.29c1986e53833p+6, 0x1.a71a20834e344p+2, 0x1.d31079aba620fp+5,
+0x1.31fe85aa63fd1p+5, 0x1.4ecb96229d973p+3, 0x1.f92d615bf25acp+6, 0x1.0ea7e89e1d4fdp+6,
+0x1.9eb8233b3d704p+5, 0x1.58d269c2b1a4dp+3, 0x1.f0f6316be1ec6p+5, 0x1.a4c3231b49864p+6,
+0x1.e13a2477c2745p+6, 0x1.aee5650b5dcadp+5, 0x1.386816c670d03p+6, 0x1.60485002c090ap+4,
+0x1.cafcd28395f9ap+1, 0x1.dde4f527bbc9fp+6, 0x1.5ddbcbfabbb79p+6, 0x1.5285a92aa50b5p+6,
+0x1.c242b20384856p+4, 0x1.44152ac2882a5p+3, 0x1.d29c1763a5383p+4, 0x1.866ad8230cd5bp+6,
+0x1.aec73ac35d8e7p+5, 0x1.84ecd96f09d9bp+6, 0x1.ea08437bd4108p+5, 0x1.e3d91f1bc7b24p+5,
+0x1.e615ac07cc2b6p+6, 0x1.75d5c8aaebab9p+5, 0x1.f8ceb103f19d6p+3, 0x1.824d4627049a9p+6,
+0x1.e4ac7cc7c959p+6, 0x1.662de0a2cc5bcp+4, 0x1.af560be35eac1p+4, 0x1.f6aefe63ed5ep+4,
+0x1.06c9d5e20d93bp+5, 0x1.940b915328172p+4, 0x1.8c53a83718a75p+6, 0x1.52c0fc8ea582p+6,
+0x1.203a631a4074cp+5, 0x1.099d81d2133bp+5, 0x1.ef083f4bde108p+5, 0x1.c55d58038ababp+4,
+0x1.5c41736eb882ep+6, 0x1.7f61b342fec36p+3, 0x1.92d2d40325a5bp+5, 0x1.6a995a02d532bp+6,
+0x1.ba257183744aep+1, 0x1.3a29afc274536p+3, 0x1.7a3e065af47c1p+5, 0x1.f9876033f30ecp+4,
+0x1.3f1f6d427e3eep+4, 0x1.31c60906638c1p+6, 0x1.332c0c0266582p+0, 0x1.272b78b64e56fp+6,
+0x1.6d65c4e2dacb9p+5, 0x1.f3a1a3dbe7434p+5, 0x1.9180840323011p+2, 0x1.39911cea73224p+5,
+0x1.b4bbb64769777p+6, 0x1.60c77992c18efp+4, 0x1.f15d4983e2ba9p+2, 0x1.9968330b32d06p+6,
+0x1.637aad1ac6f56p+5, 0x1.15d6af222bad6p+5, 0x1.713f2a02e27e5p+2, 0x1.3522417e6a448p+6,
+0x1.dfdc77cbbfb8fp+5, 0x1.a3679ad746cf3p+6, 0x1.0fc67c121f8dp+5, 0x1.800b6d770016ep+6,
+0x1.41b2dde28365cp+3, 0x1.7f675daefececp+6, 0x1.f162c377e2c58p+6, 0x1.8477cf2f08efap+6,
+0x1.af5394175ea73p+6, 0x1.75985af2eb30bp+5, 0x1.de22525bbc44ap+5, 0x1.bd24bfa77a498p+6,
+0x1.c422c6e388459p+5, 0x1.ac302c5b58606p+6, 0x1.dc34bd83b8698p+3, 0x1.31d93ec663b28p+6,
+0x1.bbec6abb77d8dp+5, 0x1.014d1f82029a4p+4, 0x1.6412dde2c825cp+4, 0x1.94a917cf29523p+6,
+0x1.3a2419d274483p+6, 0x1.c872fee390e6p+4, 0x1.8b8d3203171a6p+3, 0x1.ddbfa02bbb7f4p+5,
+0x1.949d3c3b293a8p+5, 0x1.421deb62843bdp+4, 0x1.1090063a21201p+5, 0x1.7c0bf4aef817fp+6,
+0x1.b6e5a4db6dcb5p+5, 0x1.3eb7eb7a7d6fdp+5, 0x1.625c6c52c4b8ep+5, 0x1.cb610e5396c22p+6,
+0x1.0b0e4242161c8p+4, 0x1.391174367222fp+6, 0x1.4b6c7bc696d8fp+6, 0x1.abe7b13357cf6p+4,
+0x1.70f1a3c2e1e34p+5, 0x1.3ccf3f3e799e8p+6, 0x1.ef71bb7bdee37p+6, 0x1.9f3197e33e633p+4,
+0x1.f79b6cb7ef36ep+6, 0x1.bd05c9537a0b9p+5, 0x1.27892ce24f126p+3, 0x1.b359a04b66b34p+5,
+0x1.156622022acc4p+5, 0x1.81def53303bdfp+4, 0x1.70c1dd02e183cp+1, 0x1.68a94662d1529p+6,
+0x1.41960a62832c1p+5, 0x1.922b198324563p+4, 0x1.faa4bc5bf5498p+5, 0x1.daef1f03b5de4p+6,
+0x1.ad4f0c3b5a9e2p+5, 0x1.2ec404725d881p+6, 0x1.939dde2b273bcp+5, 0x1.a0f6243b41ec5p+6,
+0x1.7f4b7f4afe97p+6, 0x1.5216f232a42dep+6, 0x1.1d0218e63a043p+6, 0x1.6af946d2d5f29p+4,
+0x1.f172e7efe2e5dp+6, 0x1.ce304f139c60ap+6, 0x1.30fb004261f6p+3, 0x1.a1b3c3e343678p+3,
+0x1.0741c3460e838p+6, 0x1.718bdbcee317bp+6, 0x1.3e60c9927cc19p+5, 0x1.bfba95277f753p+6,
+0x1.5cb63612b96c7p+5, 0x1.1d44408a3a888p+5, 0x1.3c37d8e2786fbp+3, 0x1.4bed0f7a97da2p+5,
+0x1.6d2504eeda4a1p+6, 0x1.31e082e263c1p+4, 0x1.7fa357e6ff46bp+6, 0x1.f7d815efefb03p+6,
+0x1.59dfbc12b3bf8p+5, 0x1.8b2966cf1652dp+6, 0x1.60815c4ec102cp+6, 0x1.4dbae33a9b75cp+6,
+0x1.efb42d33df686p+6, 0x1.774ee9f2ee9ddp+4, 0x1.28aa023a5154p+6, 0x1.8cb7669b196edp+5,
+0x1.8c97beef192f8p+6, 0x1.f278f14fe4f1ep+6, 0x1.9d475e133a8ecp+4, 0x1.0be33e3617c68p+6,
+0x1.448fe37e891fcp+6, 0x1.8453f06f08a7ep+6, 0x1.66a18feecd432p+6, 0x1.3602cb6a6c059p+6,
+0x1.52843f7ea5088p+6, 0x1.8cc0eff71981ep+6, 0x1.6a3943e6d4728p+6, 0x1.67180b02ce301p+4,
+0x1.fc999783f9333p+5, 0x1.2d3515825a6a3p+1, 0x1.98097e433013p+2, 0x1.aca7e6cf594fdp+6,
+0x1.301791e2602f2p+5, 0x1.041e4c12083cap+4, 0x1.4a79ba2294f37p+4, 0x1.4c3377029866fp+0,
+0x1.1aff677a35fedp+5, 0x1.d241c66fa4839p+6, 0x1.fd08e3cffa11cp+6, 0x1.3a6f91c674df2p+6,
+0x1.5d6b2d3ebad66p+6, 0x1.5d8a401abb148p+6, 0x1.1054e9fa20a9dp+5, 0x1.4d1f5a6e9a3ebp+6,
+0x1.bb5dfa9776bbfp+6, 0x1.b0d4773761a8fp+6, 0x1.37b0db826f61bp+2, 0x1.47f5b9828feb7p+6,
+0x1.a34d6883469adp+6, 0x1.eb3394f3d6673p+4, 0x1.4f63dee29ec7cp+4, 0x1.cfba97fb9f753p+5,
+0x1.ff20d5abfe41bp+6, 0x1.ba7a87a774f51p+6, 0x1.de017643bc02fp+2, 0x1.51a51526a34a3p+6,
+0x1.473b779a8e76fp+6, 0x1.88195b4b1032bp+6, 0x1.ab6b17e756d63p+6, 0x1.16210d622c422p+4,
+0x1.918303fb2306p+6, 0x1.c4ebafcf89d76p+6, 0x1.f2302a27e4605p+6, 0x1.4c76674298ecdp+3,
+0x1.7cd0b402f9a17p+0, 0x1.133a62c22674cp+4, 0x1.75fcd642ebf9bp+3, 0x1.26e5ed1a4dcbep+5,
+0x1.7105f1c2e20bep+2, 0x1.5e43f4a2bc87fp+3, 0x1.cde288579bc51p+6, 0x1.747b8c5ae8f72p+6,
+0x1.8952beaf12a58p+6, 0x1.5833f542b067fp+4, 0x1.8335cd8b066bap+5, 0x1.44b0b94689617p+6,
+0x1.b85d220370ba4p+0, 0x1.aa2be8fb5457dp+5, 0x1.194ce58a3299dp+5, 0x1.aa2edd0b545dcp+6,
+0x1.4fe2d9be9fc5bp+6, 0x1.c0fed4fb81fdbp+5, 0x1.241852124830ap+5, 0x1.4f03af669e076p+6,
+0x1.35f3e4426be7dp+5, 0x1.5fd880dabfb1p+5, 0x1.4151891a82a31p+5, 0x1.e23569bbc46adp+6,
+0x1.c02cddc38059cp+3, 0x1.304f71c2609eep+4, 0x1.3ded68a27bdadp+3, 0x1.c9889fb393114p+6,
+0x1.0ff8c3c21ff18p+2, 0x1.9edd73833dbaep+2, 0x1.f3176c9be62eep+6, 0x1.6f2cf0c2de59ep+2,
+0x1.7af1bfa2f5e38p+4, 0x1.0eb83b021d707p+3, 0x1.54cb8b3aa9971p+5, 0x1.d7333c23ae668p+4,
+0x1.367e17d26cfc3p+4, 0x1.e12137c3c2427p+4, 0x1.ea485b63d490bp+6, 0x1.d6f244a7ade49p+6,
+0x1.9caa968339553p+5, 0x1.57c68452af8d1p+5, 0x1.1ba2fdea3746p+6, 0x1.aa6d7f9354dbp+5,
+0x1.80f936a701f27p+6, 0x1.a84970af5092ep+6, 0x1.fd967353fb2cep+4, 0x1.a1b820c343704p+5,
+0x1.1191b65a23237p+5, 0x1.1171c5de22e39p+6, 0x1.fdfbfc83fbf8p+2, 0x1.23c2cd4e4785ap+6,
+0x1.c15e064b82bc1p+6, 0x1.811108ab02221p+5, 0x1.05f8370a0bf07p+6, 0x1.f963a203f2c74p+6,
+0x1.0c9c60c61938cp+6, 0x1.2db5e41e5b6bdp+6, 0x1.c2ec41b385d88p+6, 0x1.1d9bed063b37ep+6,
+0x1.47a3bb568f477p+6, 0x1.b603ae4f6c076p+6, 0x1.348ebc12691d8p+6, 0x1.a6602b434cc05p+6,
+0x1.d7dab5afafb57p+6, 0x1.def481afbde9p+6, 0x1.c2cfa483859f5p+2, 0x1.2bd1dd2257a3cp+3,
+0x1.5cf33e72b9e68p+4, 0x1.9d556a033aaadp+0, 0x1.fc6c804bf8d9p+6, 0x1.25921ae24b243p+6,
+0x1.64b12fa2c9626p+5, 0x1.180f7e32301fp+6, 0x1.fac8daabf591bp+6, 0x1.9a8e73c3351cep+3,
+0x1.80b1ddbb0163cp+5, 0x1.e8b9ddf3d173cp+4, 0x1.042ddeda085bcp+6, 0x1.4921ca0a92439p+6,
+0x1.8ba03d5b17408p+6, 0x1.240d9ea2481b4p+6, 0x1.b3925d636724cp+4, 0x1.4cfe43a699fc8p+6,
+0x1.e49622f7c92c4p+6, 0x1.72dcce62e5b9ap+6, 0x1.4661e5a68cc3dp+6, 0x1.e265077bc4ca1p+5,
+0x1.412564fa824adp+5, 0x1.094e275a129c5p+6, 0x1.d9ce1803b39c3p+1, 0x1.e8366dd3d06cep+6,
+0x1.7ea3ab4afd475p+5, 0x1.435d2cd286ba6p+6, 0x1.8e9699131d2d3p+6, 0x1.2e5916a25cb23p+5,
+0x1.2251ae8244a36p+6, 0x1.aac3935b55872p+6, 0x1.794d8deaf29b2p+5, 0x1.798e7e1ef31dp+6,
+0x1.b138e9076271dp+6, 0x1.72268e7ae44d2p+5, 0x1.3e4131fa7c826p+5, 0x1.8e4603531c8cp+4,
+0x1.d122c56fa2459p+6, 0x1.33d2e75267a5dp+5, 0x1.2dc69e9a5b8d4p+5, 0x1.22f7689a45eedp+5,
+0x1.1417eb26282fdp+6, 0x1.9b112e2b36226p+6, 0x1.da9d7e57b53bp+6, 0x1.3f7051027ee0ap+5,
+0x1.7e3d9992fc7b3p+5, 0x1.1e0856b23c10bp+4, 0x1.ecb66c27d96cep+6, 0x1.4769df828ed3cp+5,
+0x1.ba5ee40f74bddp+6, 0x1.331851ca6630ap+6, 0x1.94e7737f29ceep+6, 0x1.6bc65a22d78cbp+4,
+0x1.e333c903c6679p+3, 0x1.a3b5e43f476bdp+6, 0x1.0ca0117219402p+4, 0x1.f7709d8beee14p+5,
+0x1.ce26221b9c4c4p+5, 0x1.d1be9d6fa37d4p+6, 0x1.92e4da1b25c9bp+6, 0x1.2c97f182592fep+1,
+0x1.7c8230caf9046p+6, 0x1.3e2e84327c5d1p+4, 0x1.82f33daf05e68p+6, 0x1.2dbb19ce5b763p+6,
+0x1.089ee84e113ddp+6, 0x1.109eb542213d7p+3, 0x1.914c9aa322993p+6, 0x1.b3835b736706bp+5,
+0x1.77fa94a2eff53p+5, 0x1.417f4f8282feap+3, 0x1.6b3d6206d67acp+6, 0x1.d015357ba02a7p+6,
+0x1.c341181b86823p+6, 0x1.45dae05e8bb5cp+6, 0x1.bf3577e37e6afp+4, 0x1.04bfc9c2097f9p+5,
+0x1.8d5cf60b1ab9fp+6, 0x1.720f2872e41e5p+4, 0x1.2614d4a24c29bp+6, 0x1.47bbda1a8f77bp+6,
+0x1.8f9c1be71f383p+6, 0x1.75f8903aebf12p+5, 0x1.a2ad70a3455aep+6, 0x1.cc02950b98053p+6,
+0x1.7ac8b162f5916p+4, 0x1.e5d574ffcbaafp+6, 0x1.8f75c79b1eeb9p+5, 0x1.45c53d6a8b8a8p+6,
+0x1.b794126f6f282p+6, 0x1.6a7ef792d4fdfp+4, 0x1.4f29fcf69e54p+6, 0x1.34164336682c8p+6,
+0x1.5456bdeaa8ad8p+5, 0x1.a43a75434874fp+5, 0x1.874574030e8afp+4, 0x1.b2ca474365949p+6,
+0x1.e862229bd0c44p+5, 0x1.f31df7a3e63bfp+6, 0x1.1917e9f2322fdp+5, 0x1.b02e5b9f605cbp+6,
+0x1.b4de190369bc3p+2, 0x1.f7c95703ef92bp+6, 0x1.8043911700872p+6, 0x1.de8ef9abbd1dfp+6,
+0x1.3da4375e7b487p+6, 0x1.f010ef0fe021ep+6, 0x1.83bb7a330776fp+4, 0x1.96025acb2c04bp+5,
+0x1.3252e4a264a5dp+4, 0x1.8703b32f0e076p+6, 0x1.2bd077c257a0fp+2, 0x1.dc30d513b861bp+6,
+0x1.07ffed320fffep+4, 0x1.b56a78236ad4fp+6, 0x1.a8336a1b5066dp+6, 0x1.41644f4a82c8ap+5,
+0x1.9b3fed1f367fep+6, 0x1.bfb937937f727p+4, 0x1.e677650fcceedp+6, 0x1.52d3ff8aa5a8p+6,
+0x1.951c179b2a383p+5, 0x1.35a162066b42cp+6, 0x1.0dd4857a1ba91p+5, 0x1.74b96ac2e972dp+6,
+0x1.efa72903df4e5p+0, 0x1.d1773f7ba2ee8p+5, 0x1.2783b2024f076p+6, 0x1.f7df5be3efbebp+5,
+0x1.b7b32ec36f666p+5, 0x1.b40fa6fb681f5p+6, 0x1.583c1322b0782p+5, 0x1.ee4ef1e3dc9dep+5,
+0x1.abd8fdfb57b2p+6, 0x1.630cd522c619bp+3, 0x1.ab6ce53b56d9dp+5, 0x1.d2fa6aaba5f4dp+5,
+0x1.c7289b438e513p+2, 0x1.36a5512a6d4aap+6, 0x1.b47e62bf68fccp+6, 0x1.a41d0b73483a1p+4,
+0x1.7b5208aaf6a41p+5, 0x1.c73b6a3b8e76dp+6, 0x1.14e05fb229c0cp+4, 0x1.ff51ff43fea4p+5,
+0x1.7ca5e25af94bcp+6, 0x1.ed6b8207dad7p+6, 0x1.a05b274b40b65p+6, 0x1.17e5cf7a2fcbap+6,
+0x1.75673fb2eace8p+4, 0x1.86d28c570da52p+6, 0x1.aae73c0355ce8p+4, 0x1.27e7dbba4fcfbp+6,
+0x1.78e7dcb2f1cfcp+5, 0x1.e3482383c6904p+5, 0x1.39428cf272852p+5, 0x1.8865160310ca3p+5,
+0x1.da5fb17fb4bf6p+6, 0x1.c424f87b8849fp+6, 0x1.c02238f380447p+6, 0x1.6c7291bad8e52p+5,
+0x1.78349f72f0694p+6, 0x1.b1010a0362021p+4, 0x1.ad60c1d35ac18p+6, 0x1.240d9d6e481b4p+6,
+0x1.3143ba5262877p+5, 0x1.062e68da0c5cdp+5, 0x1.b15a580362b4bp+1, 0x1.6a28cdbad451ap+5,
+0x1.b9bc859773791p+6, 0x1.c209357f84127p+6, 0x1.1e1ba9ba3c375p+6, 0x1.dd9627a3bb2c5p+4,
+0x1.89449fbb12894p+6, 0x1.6353c1aac6a78p+6, 0x1.770e898eee1d1p+6, 0x1.05ea82120bd5p+6,
+0x1.50bf43aea17e8p+6, 0x1.1769b0d62ed36p+6, 0x1.dd051883ba0a3p+2, 0x1.ae19139b5c322p+6,
+0x1.3c787a5278f0fp+5, 0x1.1114411a22288p+5, 0x1.ac01dea35803cp+5, 0x1.5ab02b86b5605p+6,
+0x1.7a2e324ef45c6p+6, 0x1.72a235cae5447p+6, 0x1.ee2b6843dc56dp+2, 0x1.548de3caa91bcp+6,
+0x1.36c72e426d8e6p+6, 0x1.df04ef77be09ep+6, 0x1.58e59502b1cb3p+1, 0x1.5df79b6abbef3p+5,
+0x1.2d14c7e25a299p+4, 0x1.b827ee7b704fep+6, 0x1.d3096b23a612dp+6, 0x1.c7ce1e438f9c4p+5,
+};
+
index 9c3a3e8d7bb0e378be5c18b061b2279fb966c805..596346a0c2960e3443307e6e5118ddcbb4556940 100644 (file)
@@ -24,6 +24,7 @@
 #define NEEDS_BABL_DB
 #include "babl-internal.h"
 #include "babl-db.h"
+#include "babl-ref-pixels.h"
 
 static int
 babl_type_destroy (void *data)
@@ -169,32 +170,6 @@ babl_type_new (void *first_arg,
 
 
 #define TOLERANCE    0.000000001
-#define samples      512
-
-static double test[samples];
-
-static double r_interval (double min, double max)
-{
-  long int rand_i = random ();
-  double   ret;
-
-  ret  = (double) rand_i / RAND_MAX;
-  ret *= (max - min);
-  ret += min;
-  return ret;
-}
-
-static void test_init (double min, double max)
-{
-  int i;
-
-  srandom (20050728);
-  for (i = 0; i < samples; i++)
-    {
-      test [i] = r_interval (min, max);
-    }
-}
-
 
 static const Babl *double_vector_format (void)
 {
@@ -223,7 +198,8 @@ babl_type_is_symmetric (const Babl *babl)
   Babl       *fish_to;
   Babl       *fish_from;
 
-  test_init (0.0, 182.0);
+  const int   samples = babl_get_num_type_test_pixels ();
+  const double *test_pixels = babl_get_type_test_pixels ();
 
   ref_fmt = double_vector_format ();
   fmt     = babl_format_new (babl_model ("Y"),
@@ -238,7 +214,7 @@ babl_type_is_symmetric (const Babl *babl)
   destination = babl_calloc (1, babl->type.bits / 8 * samples);
   transformed = babl_calloc (1, 64 / 8 * samples);
 
-  babl_process (fish_to, test, original, samples);
+  babl_process (fish_to, test_pixels, original, samples);
   babl_process (fish_from, original, clipped, samples);
   babl_process (fish_to, clipped, destination, samples);
   babl_process (fish_from, destination, transformed, samples);
@@ -257,7 +233,7 @@ babl_type_is_symmetric (const Babl *babl)
           {
             if (cnt++ < 4)
               babl_log ("%s:  %f %f %f)",
-                        babl->instance.name, test[i], clipped[i], transformed[i]
+                        babl->instance.name, test_pixels[i], clipped[i], transformed[i]
               );
             is_symmetrical = 0;
           }
index 9729e0480f85d241db192b5e7c7d924c568bd8d0..252a3823f5c8a734e02f20a58c235254281cc67b 100644 (file)
 #error "babl-version.h must not be included directly, include babl.h instead."
 #endif
 
-
 /**
+ * Babl:
+ *
  * The babl API is based around polymorphism and almost everything is
  * a Babl object.
- */
+ *
+ * Rename to: Object
+ **/
 typedef union _Babl Babl;
 
 /* Conversion function between linear data of a either a data types or
index 40ddfa2c2bc03c88e5aed08ee4cf257ec553b226..f68a68480a1f181b71d4d8ed4675c024baba122d 100644 (file)
 #include <math.h>
 #include "babl-internal.h"
 
+#ifdef __WIN32__
+#include <windows.h>
+#else
 #include <sys/time.h>
 #include <time.h>
+#endif
 
+#ifdef __WIN32__
+static LARGE_INTEGER start_time;
+static LARGE_INTEGER timer_freq;
+
+static void
+init_ticks (void)
+{
+  static int done = 0;
+
+  if (done)
+    return;
+  done = 1;
+
+  QueryPerformanceCounter(&start_time);
+  QueryPerformanceFrequency(&timer_freq);
+}
+
+long
+babl_ticks (void)
+{
+  LARGE_INTEGER end_time;
+
+  init_ticks ();
+
+  QueryPerformanceCounter(&end_time);
+  return (end_time.QuadPart - start_time.QuadPart) * (1000000.0 / timer_freq.QuadPart);
+}
+#else
 static struct timeval start_time;
 
 #define usecs(time)    ((time.tv_sec - start_time.tv_sec) * 1000000 + time.tv_usec)
@@ -46,6 +78,7 @@ babl_ticks (void)
   gettimeofday (&measure_time, NULL);
   return usecs (measure_time) - usecs (start_time);
 }
+#endif
 
 long
 babl_process_cost (long ticks_start,
@@ -55,9 +88,9 @@ babl_process_cost (long ticks_start,
 }
 
 double
-babl_rel_avg_error (double *imgA,
-                    double *imgB,
-                    long    samples)
+babl_rel_avg_error (const double *imgA,
+                    const double *imgB,
+                    long          samples)
 {
   double error = 0.0;
   long   i;
index bdaeec81351eb5cc46549c811348f79078309c08..e04120eb7375b9206e0adcd03b948b4fe43bd830 100644 (file)
@@ -27,7 +27,7 @@ babl_process_cost (long ticks_start,
                    long ticks_end);
 
 double
-babl_rel_avg_error (double *imgA,
-                    double *imgB,
-                    long    samples);
+babl_rel_avg_error (const double *imgA,
+                    const double *imgB,
+                    long          samples);
 #endif
index 75a7c299e8a9d526fd6824fba3895a95f7b6ed05..3630854d06830a267090211440aaea6b90f82ee3 100644 (file)
@@ -34,7 +34,7 @@
 
 #define BABL_MAJOR_VERSION 0
 #define BABL_MINOR_VERSION 1
-#define BABL_MICRO_VERSION 10
+#define BABL_MICRO_VERSION 12
 
 /** Get the version information on the babl library */
 void   babl_get_version (int *major,
index bc3f7de8f7ea86144d5de33482f77e61078e2b8e..0484d30aa54d04685794bcb35ed39c8c7c700c1e 100644 (file)
 
 static int ref_count = 0;
 
+#ifdef _WIN32
+static HMODULE libbabl_dll = NULL;
+
+/* Minimal DllMain that just stores the handle to this DLL */
+
+BOOL WINAPI                    /* Avoid silly "no previous prototype" gcc warning */
+DllMain (HINSTANCE hinstDLL,
+         DWORD     fdwReason,
+         LPVOID    lpvReserved);
+
+BOOL WINAPI
+DllMain (HINSTANCE hinstDLL,
+         DWORD     fdwReason,
+         LPVOID    lpvReserved)
+{
+  switch (fdwReason)
+    {
+      case DLL_PROCESS_ATTACH:
+        libbabl_dll = hinstDLL;
+        break;
+    }
+
+  return TRUE;
+}
+
+#else
 #define BABL_PATH              LIBDIR BABL_DIR_SEPARATOR BABL_LIBRARY
+#endif /* _WIN32 */
 
-static const char *
+/*
+ * Returns a list of directories if the environment variable $BABL_PATH
+ * is set, or the installation library directory by default.
+ * This directory will be based on the compilation-time prefix for UNIX
+ * and an actual DLL path for Windows.
+ *
+ * Returns: a string which must be freed after usage.
+ */
+static char *
 babl_dir_list (void)
 {
-  const char *ret;
+  char *ret;
 
   ret = getenv ("BABL_PATH");
   if (!ret)
-    ret = BABL_PATH;
+    {
+#ifdef _WIN32
+      /* Figure it out from the location of this DLL */
+      char *filename;
+      int filename_size;
+      char *sep1, *sep2;
+
+      wchar_t w_filename[MAX_PATH];
+      DWORD nSize = sizeof (w_filename) / sizeof ((w_filename)[0]);
+
+      if (GetModuleFileNameW (libbabl_dll, w_filename, nSize) == 0)
+        babl_fatal ("GetModuleFilenameW failed");
+
+      filename_size = WideCharToMultiByte (CP_UTF8, 0, w_filename, -1, NULL, 0,
+                                           NULL, NULL);
+      filename = babl_malloc (sizeof (char) * filename_size);
+      if (!WideCharToMultiByte (CP_UTF8, 0, w_filename, -1,
+                                filename, filename_size, NULL, NULL))
+        babl_fatal ("Converting module filename to UTF-8 failed");
+
+      /* If the DLL file name is of the format
+       * <foobar>\bin\*.dll, use <foobar>\lib\{BABL_LIBRARY}.
+       * Otherwise, use the directory where the DLL is.
+       */
+
+      sep1 = strrchr (filename, BABL_DIR_SEPARATOR[0]);
+      *sep1 = '\0';
+
+      sep2 = strrchr (filename, BABL_DIR_SEPARATOR[0]);
+      if (sep2 != NULL)
+        {
+          if (strcasecmp (sep2 + 1, "bin") == 0)
+            {
+              char* filename_tmp;
+              *(++sep2) = '\0';
+              filename_tmp = babl_malloc (sizeof (char) * (strlen (filename) +
+                                strlen (BABL_DIR_SEPARATOR BABL_LIBRARY) + 4));
+              strcpy (filename_tmp, filename);
+              babl_free (filename);
+              strcat (filename_tmp, "lib" BABL_DIR_SEPARATOR BABL_LIBRARY);
+              filename = filename_tmp;
+            }
+        }
+
+      ret = filename;
+#else
+      ret = babl_malloc (sizeof (char) * (strlen (BABL_PATH) + 1));
+      strcpy (ret, BABL_PATH);
+#endif
+    }
+  else
+    {
+      char* ret_tmp = babl_malloc (sizeof (char) * (strlen (ret) + 1));
+      strcpy (ret_tmp, ret);
+      ret = ret_tmp;
+    }
   return ret;
 }
 
@@ -41,6 +131,8 @@ babl_init (void)
 
   if (ref_count++ == 0)
     {
+      char * dir_list;
+
       babl_internal_init ();
       babl_sampling_class_init ();
       babl_type_db ();
@@ -55,7 +147,9 @@ babl_init (void)
       babl_extension_base ();
       babl_sanity ();
 
-      babl_extension_load_dir_list (babl_dir_list ());
+      dir_list = babl_dir_list ();
+      babl_extension_load_dir_list (dir_list);
+      babl_free (dir_list);
     }
 }
 
index 5e6cf42ff787bec3eb5ee9b1b406070d4481c95f..546fad62ae1deaa07997f7a92c31da484e95d880 100644 (file)
@@ -31,23 +31,31 @@ extern "C" {
 
 
 /**
+ * babl_init:
+ *
  * Initializes the babl library.
  */
 void         babl_init      (void);
 
 /**
+ * babl_exit:
+ *
  * Deinitializes the babl library and frees any resources used when
  * matched with the number of calls to babl_init().
  */
 void         babl_exit      (void);
 
 /**
+ * babl_type:
+ *
  * Returns the babl object representing the data type given by @name
  * such as for example "u8", "u16" or "float".
  */
 const Babl * babl_type      (const char *name);
 
 /**
+ * babl_sampling:
+ *
  * Returns the babl object representing the @horizontal and @vertical
  * sampling such as for example 2, 2 for the chroma components in
  * YCbCr.
@@ -56,31 +64,43 @@ const Babl * babl_sampling  (int horizontal,
                              int vertical);
 
 /**
+ * babl_component:
+ *
  * Returns the babl object representing the color component given by
  * @name such as for example "R", "cyan" or "CIE L".
  */
 const Babl * babl_component (const char *name);
 
 /**
+ * babl_model:
+ *
  * Returns the babl object representing the color model given by @name
  * such as for example "RGB", "CMYK" or "CIE Lab".
  */
 const Babl * babl_model     (const char *name);
 
 /**
+ * babl_format:
+ *
  * Returns the babl object representing the color format given by
  * @name such as for example "RGB u8", "CMYK float" or "CIE Lab u16".
  */
 const Babl * babl_format    (const char *name);
 
-/*  Create a babl fish capable of converting from source_format to
+/**
+ * babl_fish:
+ *
+ *  Create a babl fish capable of converting from source_format to
  *  destination_format, source and destination can be either strings
  *  with the names of the formats or Babl-format objects.
  */
 const Babl * babl_fish      (const void *source_format,
                              const void *destination_format);
 
-/** Process n pixels from source to destination using babl_fish,
+/**
+ * babl_process:
+ *
+ *  Process n pixels from source to destination using babl_fish,
  *  returns number of pixels converted.
  */
 long         babl_process   (const Babl *babl_fish,
@@ -90,26 +110,43 @@ long         babl_process   (const Babl *babl_fish,
 
 
 /**
+ * babl_get_name:
+ *
  * Returns a string decsribing a Babl object.
  */
 const char * babl_get_name                     (const Babl *babl);
 
 /**
+ * babl_format_has_alpha:
+ *
  * Returns whether the @format has an alpha channel.
  */
 int          babl_format_has_alpha             (const Babl *format);
 
 /**
+ * babl_format_get_bytes_per_pixel:
+ *
  * Returns the bytes per pixel for a babl color format.
  */
 int          babl_format_get_bytes_per_pixel   (const Babl *format);
 
 /**
+ * babl_format_get_model:
+ *
+ * Return the model used for constructing the format.
+ */
+const Babl * babl_format_get_model             (const Babl *format);
+
+/**
+ * babl_format_get_n_components:
+ *
  * Returns the number of components for the given @format.
  */
 int          babl_format_get_n_components      (const Babl *format);
 
 /**
+ * babl_format_get_type:
+ *
  * Returns the type in the given @format for the given
  * @component_index.
  */
@@ -118,6 +155,8 @@ const Babl * babl_format_get_type              (const Babl *format,
 
 
 /**
+ * babl_type_new:
+ *
  * Defines a new data type in babl. A data type that babl can have in
  * its buffers requires conversions to and from "double" to be
  * registered before passing sanity.
@@ -132,6 +171,8 @@ const Babl * babl_type_new (void *first_arg,
                             ...) BABL_ARG_NULL_TERMINATED;
 
 /**
+ * babl_component_new:
+ *
  * Defines a new color component with babl.
  *
  *     babl_component_new  (const char *name,
@@ -141,6 +182,8 @@ const Babl * babl_component_new  (void *first_arg,
                                   ...) BABL_ARG_NULL_TERMINATED;
 
 /**
+ * babl_model_new:
+ *
  * Defines a new color model in babl. If no name is provided a name is
  * generated by concatenating the name of all the involved components.
  *
@@ -153,6 +196,8 @@ const Babl * babl_model_new (void *first_arg,
                             ...) BABL_ARG_NULL_TERMINATED;
 
 /**
+ * babl_format_new:
+ *
  * Defines a new pixel format in babl. Provided BablType and|or
  * BablSampling is valid for the following components as well. If no
  * name is provided a (long) descriptive name is used.
@@ -173,6 +218,8 @@ const Babl * babl_format_new (const void *first_arg,
                               ...) BABL_ARG_NULL_TERMINATED;
 
 /*
+ * babl_format_n:
+ *
  * Defines a new pixel format in babl. With the specified data storage
  * type and the given number of components. At the moment behavior of
  * conversions are only well defined to other babl_format_n derived formats
@@ -183,11 +230,15 @@ babl_format_n (const Babl *type,
                int   components);
 
 /**
+ * babl_format_is_format_n:
+ *
  * Returns whether the @format is a format_n type.
  */
 int babl_format_is_format_n (const Babl *format);
 
 /**
+ * babl_conversion_new:
+ *
  * Defines a new conversion between either two formats, two models or
  * two types in babl.
  *
@@ -202,6 +253,8 @@ const Babl * babl_conversion_new (const void *first_arg,
 
 
 /**
+ * babl_new_palette:
+ *
  * create a new palette based format, name is optional pass in NULL to get
  * an anonymous format. If you pass in with_alpha the format also gets
  * an 8bit alpha channel. Returns the BablModel of the color model. If
@@ -213,11 +266,15 @@ const Babl *babl_new_palette (const char  *name,
                               const Babl **format_u8_with_alpha);
 
 /**
+ * babl_format_is_palette:
+ *
  * check whether a format is a palette backed format.
  */
 int   babl_format_is_palette   (const Babl *format);
 
 /**
+ * babl_palette_set_palette:
+ *
  * Assign a palette to a palette format, the data is a single span of pixels
  * representing the colors of the palette.
  */
@@ -227,6 +284,8 @@ void  babl_palette_set_palette (const Babl        *babl,
                                 int                count);
 
 /**
+ * babl_palette_reset:
+ *
  * reset a palette to initial state, frees up some caches that optimize
  * conversions.
  */
@@ -235,6 +294,8 @@ void  babl_palette_reset       (const Babl        *babl);
 
 
 /**
+ * babl_set_user_data: (skip)
+ *
  * associate a data pointer with a format/model, this data can be accessed and
  * used from the conversion functions, encoding color profiles, palettes or
  * similar with the data, perhaps this should be made internal API, not
@@ -243,7 +304,9 @@ void  babl_palette_reset       (const Babl        *babl);
 void   babl_set_user_data     (const Babl *babl, void *data);
 
 /**
- * get data set with babl_set_user_data
+ * babl_get_user_data: (skip)
+ *
+ * Get data set with babl_set_user_data
  */
 void * babl_get_user_data     (const Babl *babl);
 
index 1c1da0f5758a09861d0794695cdf967021678f54..5b92521970b9676518233be302683c18c809b525 100644 (file)
@@ -5,8 +5,11 @@ h_sources =                    \
 c_sources =                    \
        babl-base.c             \
        formats.c               \
+       pow-24.c                \
        type-float.c            \
+       type-half.c             \
        type-u8.c               \
+       type-u15.c              \
        type-u16.c              \
        type-u32.c              \
        model-rgb.c             \
@@ -21,5 +24,6 @@ libbase_la_LIBADD = $(MATH_LIB)
 
 EXTRA_DIST =           \
        rgb-constants.h \
-       util.h
+       util.h  \
+       pow-24.h
 
index 8df47d247336821f9309dfa3ff7025272c817dde..318c2347d14bc36a69103922b2d6f2d98c64782b 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 @SET_MAKE@
 
 VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -34,14 +51,14 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
+target_triplet = @target@
 subdir = babl/base
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/introspection.m4 \
-       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
-       $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -52,9 +69,9 @@ LTLIBRARIES = $(noinst_LTLIBRARIES)
 am__DEPENDENCIES_1 =
 libbase_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
 am__objects_1 =
-am__objects_2 = babl-base.lo formats.lo type-float.lo type-u8.lo \
-       type-u16.lo type-u32.lo model-rgb.lo model-gray.lo \
-       model-ycbcr.lo
+am__objects_2 = babl-base.lo formats.lo pow-24.lo type-float.lo \
+       type-half.lo type-u8.lo type-u15.lo type-u16.lo type-u32.lo \
+       model-rgb.lo model-gray.lo model-ycbcr.lo
 am_libbase_la_OBJECTS = $(am__objects_1) $(am__objects_2)
 libbase_la_OBJECTS = $(am_libbase_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
@@ -88,6 +105,11 @@ am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
 am__v_GEN_0 = @echo "  GEN   " $@;
 SOURCES = $(libbase_la_SOURCES)
 DIST_SOURCES = $(libbase_la_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -137,14 +159,6 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
-INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
-INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
-INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
-INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
-INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
-INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
-INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -174,18 +188,15 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEP = @PATH_SEP@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
 RANLIB = @RANLIB@
 RSVG = @RSVG@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SHREXT = @SHREXT@
+SSE2_EXTRA_CFLAGS = @SSE2_EXTRA_CFLAGS@
 SSE_EXTRA_CFLAGS = @SSE_EXTRA_CFLAGS@
 STRIP = @STRIP@
-VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 W3M = @W3M@
 WEBSITE_HOST = @WEBSITE_HOST@
@@ -238,7 +249,11 @@ sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sysconfdir = @sysconfdir@
+target = @target@
 target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
@@ -248,8 +263,11 @@ h_sources = \
 c_sources = \
        babl-base.c             \
        formats.c               \
+       pow-24.c                \
        type-float.c            \
+       type-half.c             \
        type-u8.c               \
+       type-u15.c              \
        type-u16.c              \
        type-u32.c              \
        model-rgb.c             \
@@ -262,7 +280,8 @@ libbase_la_SOURCES = $(h_sources) $(c_sources)
 libbase_la_LIBADD = $(MATH_LIB)
 EXTRA_DIST = \
        rgb-constants.h \
-       util.h
+       util.h  \
+       pow-24.h
 
 all: all-am
 
@@ -321,7 +340,10 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/model-gray.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/model-rgb.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/model-ycbcr.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pow-24.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/type-float.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/type-half.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/type-u15.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/type-u16.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/type-u32.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/type-u8.Plo@am__quote@
index 1271a43dcb3fc48f189c9b6e48f2415d45daa00a..3fe3cfc2288df06be6967c0e16e3cf5a9cce1b8f 100644 (file)
@@ -50,6 +50,8 @@ babl_base_destroy (void)
 static void
 types (void)
 {
+  babl_base_type_u15 ();
+  babl_base_type_half ();
   babl_base_type_float ();
   babl_base_type_u8 ();
   babl_base_type_u16 ();
@@ -64,7 +66,9 @@ types (void)
 static void
 models (void)
 {
+  babl_hmpf_on_name_lookups--;
   babl_base_model_rgb ();
   babl_base_model_gray ();
+  babl_hmpf_on_name_lookups++;
   babl_base_model_ycbcr ();
 }
index bed3c64473c2b2540d481539e3f62116d5d645c9..588e2f13c2f6e9635760c017ccbfa43a2b738a59 100644 (file)
@@ -23,9 +23,11 @@ void babl_base_init (void);
 void babl_base_destroy (void);
 void babl_formats_init (void);
 
+void babl_base_type_half   (void);
 void babl_base_type_float  (void);
 void babl_base_type_u8     (void);
 void babl_base_type_u16    (void);
+void babl_base_type_u15    (void);
 void babl_base_type_u32    (void);
 
 void babl_base_model_pal   (void);
index 5582c782361cf17d608b57ef1504866cfe07aa49..239333e1fc23826182428d8239e4c16c189fba23 100644 (file)
 static void components (void);
 static void models (void);
 static void conversions (void);
+static void formats (void);
 
 void babl_base_model_gray (void)
 {
   components ();
   models ();
   conversions ();
+  formats ();
 }
 
 static void
@@ -585,3 +587,113 @@ conversions (void)
     NULL
   );
 }
+
+static void
+formats (void)
+{
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY_ALPHA),
+    babl_type_from_id (BABL_HALF),
+    babl_component_from_id (BABL_LUMINANCE),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY_ALPHA_PREMULTIPLIED),
+    babl_type_from_id (BABL_HALF),
+    babl_component_from_id (BABL_LUMINANCE_MUL_ALPHA),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY),
+    babl_type_from_id (BABL_HALF),
+    babl_component_from_id (BABL_LUMINANCE),
+    NULL);
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY_GAMMA_2_2_ALPHA),
+    babl_type_from_id (BABL_HALF),
+    babl_component_from_id (BABL_LUMA),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY_GAMMA_2_2_ALPHA_PREMULTIPLIED),
+    babl_type_from_id (BABL_HALF),
+    babl_component_from_id (BABL_LUMA_MUL_ALPHA),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY_GAMMA_2_2),
+    babl_type_from_id (BABL_HALF),
+    babl_component_from_id (BABL_LUMA),
+    NULL);
+  /***********/
+
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY_ALPHA),
+    babl_type ("u15"),
+    babl_component_from_id (BABL_LUMINANCE),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY_ALPHA_PREMULTIPLIED),
+    babl_type ("u15"),
+    babl_component_from_id (BABL_LUMINANCE_MUL_ALPHA),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY),
+    babl_type ("u15"),
+    babl_component_from_id (BABL_LUMINANCE),
+    NULL);
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY_GAMMA_2_2_ALPHA),
+    babl_type ("u15"),
+    babl_component_from_id (BABL_LUMA),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY_GAMMA_2_2_ALPHA_PREMULTIPLIED),
+    babl_type ("u15"),
+    babl_component_from_id (BABL_LUMA_MUL_ALPHA),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY_GAMMA_2_2),
+    babl_type ("u15"),
+    babl_component_from_id (BABL_LUMA),
+    NULL);
+
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY_ALPHA),
+    babl_type_from_id (BABL_U32),
+    babl_component_from_id (BABL_LUMINANCE),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY_ALPHA_PREMULTIPLIED),
+    babl_type_from_id (BABL_U32),
+    babl_component_from_id (BABL_LUMINANCE_MUL_ALPHA),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY),
+    babl_type_from_id (BABL_U32),
+    babl_component_from_id (BABL_LUMINANCE),
+    NULL);
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY_GAMMA_2_2_ALPHA),
+    babl_type_from_id (BABL_U32),
+    babl_component_from_id (BABL_LUMA),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY_GAMMA_2_2_ALPHA_PREMULTIPLIED),
+    babl_type_from_id (BABL_U32),
+    babl_component_from_id (BABL_LUMA_MUL_ALPHA),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+  babl_format_new (
+    babl_model_from_id (BABL_GRAY_GAMMA_2_2),
+    babl_type_from_id (BABL_U32),
+    babl_component_from_id (BABL_LUMA),
+    NULL);
+}
index df7f7b0f960d036eeeceb365725df8c2cd282f3a..4ba6f7d3f224f6f6be2f04836e8e6865adfb1d80 100644 (file)
@@ -516,6 +516,166 @@ formats (void)
     babl_component_from_id (BABL_BLUE),
     NULL);
 
+  babl_format_new (
+    "id", BABL_RGB_HALF,
+    babl_model_from_id (BABL_RGB),
+    babl_type_from_id (BABL_HALF),
+    babl_component_from_id (BABL_RED),
+    babl_component_from_id (BABL_GREEN),
+    babl_component_from_id (BABL_BLUE),
+    NULL);
+
+  babl_format_new (
+    "id", BABL_RGBA_HALF,
+    babl_model_from_id (BABL_RGBA),
+    babl_type_from_id (BABL_HALF),
+    babl_component_from_id (BABL_RED),
+    babl_component_from_id (BABL_GREEN),
+    babl_component_from_id (BABL_BLUE),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+
+  babl_format_new (
+    babl_model_from_id (BABL_RGBA_PREMULTIPLIED),
+    babl_type_from_id (BABL_HALF),
+    babl_component_from_id (BABL_RED_MUL_ALPHA),
+    babl_component_from_id (BABL_GREEN_MUL_ALPHA),
+    babl_component_from_id (BABL_BLUE_MUL_ALPHA),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+
+  babl_format_new (
+    babl_model_from_id (BABL_RGB_GAMMA_2_2),
+    babl_type_from_id (BABL_HALF),
+    babl_component_from_id (BABL_RED_GAMMA_2_2),
+    babl_component_from_id (BABL_GREEN_GAMMA_2_2),
+    babl_component_from_id (BABL_BLUE_GAMMA_2_2),
+    NULL);
+
+  babl_format_new (
+    babl_model_from_id (BABL_RGBA_GAMMA_2_2),
+    babl_type_from_id (BABL_HALF),
+    babl_component_from_id (BABL_RED_GAMMA_2_2),
+    babl_component_from_id (BABL_GREEN_GAMMA_2_2),
+    babl_component_from_id (BABL_BLUE_GAMMA_2_2),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+
+  babl_format_new (
+    babl_model_from_id (BABL_RGBA_GAMMA_2_2_PREMULTIPLIED),
+    babl_type_from_id (BABL_HALF),
+    babl_component_from_id (BABL_RED_GAMMA_2_2_MUL_ALPHA),
+    babl_component_from_id (BABL_GREEN_GAMMA_2_2_MUL_ALPHA),
+    babl_component_from_id (BABL_BLUE_GAMMA_2_2_MUL_ALPHA),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+
+  /******/
+  babl_format_new (
+    babl_model_from_id (BABL_RGB),
+    babl_type ("u15"),
+    babl_component_from_id (BABL_RED),
+    babl_component_from_id (BABL_GREEN),
+    babl_component_from_id (BABL_BLUE),
+    NULL);
+
+  babl_format_new (
+    babl_model_from_id (BABL_RGBA),
+    babl_type ("u15"),
+    babl_component_from_id (BABL_RED),
+    babl_component_from_id (BABL_GREEN),
+    babl_component_from_id (BABL_BLUE),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+
+  babl_format_new (
+    babl_model_from_id (BABL_RGBA_PREMULTIPLIED),
+    babl_type ("u15"),
+    babl_component_from_id (BABL_RED_MUL_ALPHA),
+    babl_component_from_id (BABL_GREEN_MUL_ALPHA),
+    babl_component_from_id (BABL_BLUE_MUL_ALPHA),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+
+  babl_format_new (
+    babl_model_from_id (BABL_RGB_GAMMA_2_2),
+    babl_type ("u15"),
+    babl_component_from_id (BABL_RED_GAMMA_2_2),
+    babl_component_from_id (BABL_GREEN_GAMMA_2_2),
+    babl_component_from_id (BABL_BLUE_GAMMA_2_2),
+    NULL);
+
+  babl_format_new (
+    babl_model_from_id (BABL_RGBA_GAMMA_2_2),
+    babl_type ("u15"),
+    babl_component_from_id (BABL_RED_GAMMA_2_2),
+    babl_component_from_id (BABL_GREEN_GAMMA_2_2),
+    babl_component_from_id (BABL_BLUE_GAMMA_2_2),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+
+  babl_format_new (
+    babl_model_from_id (BABL_RGBA_GAMMA_2_2_PREMULTIPLIED),
+    babl_type ("u15"),
+    babl_component_from_id (BABL_RED_GAMMA_2_2_MUL_ALPHA),
+    babl_component_from_id (BABL_GREEN_GAMMA_2_2_MUL_ALPHA),
+    babl_component_from_id (BABL_BLUE_GAMMA_2_2_MUL_ALPHA),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+
+
+  babl_format_new (
+    babl_model_from_id (BABL_RGB),
+    babl_type_from_id (BABL_U32),
+    babl_component_from_id (BABL_RED),
+    babl_component_from_id (BABL_GREEN),
+    babl_component_from_id (BABL_BLUE),
+    NULL);
+
+  babl_format_new (
+    babl_model_from_id (BABL_RGBA),
+    babl_type_from_id (BABL_U32),
+    babl_component_from_id (BABL_RED),
+    babl_component_from_id (BABL_GREEN),
+    babl_component_from_id (BABL_BLUE),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+
+  babl_format_new (
+    babl_model_from_id (BABL_RGBA_PREMULTIPLIED),
+    babl_type_from_id (BABL_U32),
+    babl_component_from_id (BABL_RED_MUL_ALPHA),
+    babl_component_from_id (BABL_GREEN_MUL_ALPHA),
+    babl_component_from_id (BABL_BLUE_MUL_ALPHA),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+
+  babl_format_new (
+    babl_model_from_id (BABL_RGB_GAMMA_2_2),
+    babl_type_from_id (BABL_U32),
+    babl_component_from_id (BABL_RED_GAMMA_2_2),
+    babl_component_from_id (BABL_GREEN_GAMMA_2_2),
+    babl_component_from_id (BABL_BLUE_GAMMA_2_2),
+    NULL);
+
+  babl_format_new (
+    babl_model_from_id (BABL_RGBA_GAMMA_2_2),
+    babl_type_from_id (BABL_U32),
+    babl_component_from_id (BABL_RED_GAMMA_2_2),
+    babl_component_from_id (BABL_GREEN_GAMMA_2_2),
+    babl_component_from_id (BABL_BLUE_GAMMA_2_2),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+
+  babl_format_new (
+    babl_model_from_id (BABL_RGBA_GAMMA_2_2_PREMULTIPLIED),
+    babl_type_from_id (BABL_U32),
+    babl_component_from_id (BABL_RED_GAMMA_2_2_MUL_ALPHA),
+    babl_component_from_id (BABL_GREEN_GAMMA_2_2_MUL_ALPHA),
+    babl_component_from_id (BABL_BLUE_GAMMA_2_2_MUL_ALPHA),
+    babl_component_from_id (BABL_ALPHA),
+    NULL);
+
 #ifdef XXXX
   babl_format_new (
     "id", BABL_RGB565,
diff --git a/babl/base/pow-24.c b/babl/base/pow-24.c
new file mode 100644 (file)
index 0000000..a3bb36e
--- /dev/null
@@ -0,0 +1,73 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2013 Loren Merritt
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <math.h>
+#include "util.h"
+
+/* a^b = exp(b*log(a))
+ *
+ * Extracting the exponent from a float gives us an approximate log.
+ * Or better yet, reinterpret the bitpattern of the whole float as an int.
+ *
+ * However, the output values of 12throot vary by less than a factor of 2
+ * over the domain we care about, so we only get log() that way, not exp().
+ *
+ * Approximate exp() with a low-degree polynomial; not exactly equal to the
+ * Taylor series since we're minimizing maximum error over a certain finite
+ * domain. It's not worthwhile to use lots of terms, since Newton's method
+ * has a better convergence rate once you get reasonably close to the answer.
+ */
+static inline double
+init_newton (double x, double exponent, double c0, double c1, double c2)
+{
+    int iexp;
+    double y = frexp(x, &iexp);
+    y = 2*y+(iexp-2);
+    c1 *= M_LN2*exponent;
+    c2 *= M_LN2*M_LN2*exponent*exponent;
+    return y = c0 + c1*y + c2*y*y;
+}
+
+/* Returns x^2.4 == (x*(x^(-1/5)))^3, using Newton's method for x^(-1/5).
+ */
+double
+babl_pow_24 (double x)
+{
+  double y = init_newton (x, -1./5, 0.9953189663, 0.9594345146, 0.6742970332);
+  int i;
+  for (i = 0; i < 3; i++)
+    y = (1.+1./5)*y - ((1./5)*x*(y*y))*((y*y)*(y*y));
+  x *= y;
+  return x*x*x;
+}
+
+/* Returns x^(1/2.4) == x*((x^(-1/6))^(1/2))^7, using Newton's method for x^(-1/6).
+ */
+double
+babl_pow_1_24 (double x)
+{
+  double y = init_newton (x, -1./12, 0.9976800269, 0.9885126933, 0.5908575383);
+  int i;
+  double z;
+  x = sqrt (x);
+  /* newton's method for x^(-1/6) */
+  z = (1./6.) * x;
+  for (i = 0; i < 3; i++)
+    y = (7./6.) * y - z * ((y*y)*(y*y)*(y*y*y));
+  return x*y;
+}
diff --git a/babl/base/pow-24.h b/babl/base/pow-24.h
new file mode 100644 (file)
index 0000000..e822297
--- /dev/null
@@ -0,0 +1,25 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _BASE_POW_24_H
+#define _BASE_POW_24_H
+
+extern double babl_pow_1_24 (double x);
+extern double babl_pow_24 (double x);
+
+#endif
index 8f8b41006f83185f8d0b9fd6a33824eb940ca9ce..0e470563c157f9d6a1d79f2bfef820049620cfd0 100644 (file)
  * <http://www.gnu.org/licenses/>.
  */
 
-#if 0
-#define CONTEMPORARY_MONITOR
-#endif
+/*
+ * These primaries have been adapted for a D50 illuminant.
+ *
+ * They were taken from here:
+ * http://www.brucelindbloom.com/WorkingSpaceInfo.html#AdaptedPrimaries
+ *
+ * For more information, see this thread:
+ * https://mail.gnome.org/archives/gimp-developer-list/2013-September/msg00113.html
+ */
 
-#ifdef CONTEMPORARY_MONITOR
-  /* source: http://www.poynton.com/ColorFAQ.html */
-  #define RGB_LUMINANCE_RED    (0.212671)
-  #define RGB_LUMINANCE_GREEN  (0.715160)
-  #define RGB_LUMINANCE_BLUE   (0.072169)
-#else
-  /* this is not correct, but the constants are kept around */
-  #define RGB_LUMA_RED         (0.299)
-  #define RGB_LUMA_GREEN       (0.587)
-  #define RGB_LUMA_BLUE        (0.114)
-  #define RGB_LUMINANCE_RED    RGB_LUMA_RED
-  #define RGB_LUMINANCE_GREEN  RGB_LUMA_GREEN
-  #define RGB_LUMINANCE_BLUE   RGB_LUMA_BLUE
-#endif
+#define RGB_LUMINANCE_RED    (0.222491)
+#define RGB_LUMINANCE_GREEN  (0.716888)
+#define RGB_LUMINANCE_BLUE   (0.060621)
diff --git a/babl/base/type-half.c b/babl/base/type-half.c
new file mode 100644 (file)
index 0000000..e45e34a
--- /dev/null
@@ -0,0 +1,344 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2012, Øyvind Kolås.
+ *
+ * MATLAB (R) is a trademark of The Mathworks (R) Corporation
+ *
+ * Function:    halfprecision
+ * Filename:    halfprecision.c
+ * Programmer:  James Tursa
+ * Version:     1.0
+ * Date:        March 3, 2009
+ * Copyright:   (c) 2009 by James Tursa, All Rights Reserved
+ *
+ *  This code uses the BSD License:
+ *
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions are 
+ *  met:
+ *
+ *     * Redistributions of source code must retain the above copyright 
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright 
+ *       notice, this list of conditions and the following disclaimer in 
+ *       the documentation and/or other materials provided with the distribution
+ *      
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+ *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+ *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+ *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+ *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+ *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+ *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+ *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+ *  POSSIBILITY OF SUCH DAMAGE.
+ *
+ * halfprecision converts the input argument to/from a half precision floating
+ * point bit pattern corresponding to IEEE 754r. The bit pattern is stored in a
+ * uint16 class variable. Please note that halfprecision is *not* a class. That
+ * is, you cannot do any arithmetic with the half precision bit patterns.
+ * halfprecision is simply a function that converts the IEEE 754r half precision
+ * bit pattern to/from other numeric MATLAB variables. You can, however, take
+ * the half precision bit patterns, convert them to single or double, do the
+ * operation, and then convert the result back manually.
+ *
+ * 1 bit sign bit
+ * 5 bits exponent, biased by 15
+ * 10 bits mantissa, hidden leading bit, normalized to 1.0
+ *
+ * Special floating point bit patterns recognized and supported:
+ *
+ * All exponent bits zero:
+ * - If all mantissa bits are zero, then number is zero (possibly signed)
+ * - Otherwise, number is a denormalized bit pattern
+ *
+ * All exponent bits set to 1:
+ * - If all mantissa bits are zero, then number is +Infinity or -Infinity
+ * - Otherwise, number is NaN (Not a Number)
+ */
+
+#include "config.h"
+#include <string.h>
+#include <assert.h>
+#include <stdint.h>
+
+#include "babl.h"
+#include "babl-classes.h"
+#include "babl-ids.h"
+#include "babl-base.h"
+
+static int next = 1; /* should be 0 for big endian */
+
+//-----------------------------------------------------------------------------
+
+static void doubles2halfp(void *target, void *source, long numel)
+{
+    uint16_t *hp = (uint16_t *) target; // Type pun output as an unsigned 16-bit int
+    uint32_t *xp = (uint32_t *) source; // Type pun input as an unsigned 32-bit int
+    uint16_t    hs, he, hm;
+    uint32_t x, xs, xe, xm;
+    int hes;
+
+    xp += next;  // Little Endian adjustment if necessary
+    
+    if( source == NULL || target == NULL ) { // Nothing to convert (e.g., imag part of pure real)
+        return;
+    }
+    while( numel-- ) {
+        x = *xp++; xp++; // The extra xp++ is to skip over the remaining 32 bits of the mantissa
+        if( (x & 0x7FFFFFFFu) == 0 ) {  // Signed zero
+            *hp++ = (uint16_t) (x >> 16);  // Return the signed zero
+        } else { // Not zero
+            xs = x & 0x80000000u;  // Pick off sign bit
+            xe = x & 0x7FF00000u;  // Pick off exponent bits
+            xm = x & 0x000FFFFFu;  // Pick off mantissa bits
+            if( xe == 0 ) {  // Denormal will underflow, return a signed zero
+                *hp++ = (uint16_t) (xs >> 16);
+            } else if( xe == 0x7FF00000u ) {  // Inf or NaN (all the exponent bits are set)
+                if( xm == 0 ) { // If mantissa is zero ...
+                    *hp++ = (uint16_t) ((xs >> 16) | 0x7C00u); // Signed Inf
+                } else {
+                    *hp++ = (uint16_t) 0xFE00u; // NaN, only 1st mantissa bit set
+                }
+            } else { // Normalized number
+                hs = (uint16_t) (xs >> 16); // Sign bit
+                hes = ((int)(xe >> 20)) - 1023 + 15; // Exponent unbias the double, then bias the halfp
+                if( hes >= 0x1F ) {  // Overflow
+                    *hp++ = (uint16_t) ((xs >> 16) | 0x7C00u); // Signed Inf
+                } else if( hes <= 0 ) {  // Underflow
+                    if( (10 - hes) > 21 ) {  // Mantissa shifted all the way off & no rounding possibility
+                        hm = (uint16_t) 0u;  // Set mantissa to zero
+                    } else {
+                        xm |= 0x00100000u;  // Add the hidden leading bit
+                        hm = (uint16_t) (xm >> (11 - hes)); // Mantissa
+                        if( (xm >> (10 - hes)) & 0x00000001u ) // Check for rounding
+                            hm += (uint16_t) 1u; // Round, might overflow into exp bit, but this is OK
+                    }
+                    *hp++ = (hs | hm); // Combine sign bit and mantissa bits, biased exponent is zero
+                } else {
+                    he = (uint16_t) (hes << 10); // Exponent
+                    hm = (uint16_t) (xm >> 10); // Mantissa
+                    if( xm & 0x00000200u ) // Check for rounding
+                        *hp++ = (hs | he | hm) + (uint16_t) 1u; // Round, might overflow to inf, this is OK
+                    else
+                        *hp++ = (hs | he | hm);  // No rounding
+                }
+            }
+        }
+    }
+}
+
+#if 0
+//-----------------------------------------------------------------------------
+
+static void halfp2singles(void *target, void *source, long numel)
+{
+    uint16_t *hp = (uint16_t *) source; // Type pun input as an unsigned 16-bit int
+    uint32_t *xp = (uint32_t *) target; // Type pun output as an unsigned 32-bit int
+    uint16_t h, hs, he, hm;
+    uint32_t xs, xe, xm;
+    int32_t xes;
+    int e;
+    
+    if( source == NULL || target == NULL ) // Nothing to convert (e.g., imag part of pure real)
+        return;
+    while( numel-- ) {
+        h = *hp++;
+        if( (h & 0x7FFFu) == 0 ) {  // Signed zero
+            *xp++ = ((uint32_t) h) << 16;  // Return the signed zero
+        } else { // Not zero
+            hs = h & 0x8000u;  // Pick off sign bit
+            he = h & 0x7C00u;  // Pick off exponent bits
+            hm = h & 0x03FFu;  // Pick off mantissa bits
+            if( he == 0 ) {  // Denormal will convert to normalized
+                e = -1; // The following loop figures out how much extra to adjust the exponent
+                do {
+                    e++;
+                    hm <<= 1;
+                } while( (hm & 0x0400u) == 0 ); // Shift until leading bit overflows into exponent bit
+                xs = ((uint32_t) hs) << 16; // Sign bit
+                xes = ((int32_t) (he >> 10)) - 15 + 127 - e; // Exponent unbias the halfp, then bias the single
+                xe = (uint32_t) (xes << 23); // Exponent
+                xm = ((uint32_t) (hm & 0x03FFu)) << 13; // Mantissa
+                *xp++ = (xs | xe | xm); // Combine sign bit, exponent bits, and mantissa bits
+            } else if( he == 0x7C00u ) {  // Inf or NaN (all the exponent bits are set)
+                if( hm == 0 ) { // If mantissa is zero ...
+                    *xp++ = (((uint32_t) hs) << 16) | ((uint32_t) 0x7F800000u); // Signed Inf
+                } else {
+                    *xp++ = (uint32_t) 0xFFC00000u; // NaN, only 1st mantissa bit set
+                }
+            } else { // Normalized number
+                xs = ((uint32_t) hs) << 16; // Sign bit
+                xes = ((int32_t) (he >> 10)) - 15 + 127; // Exponent unbias the halfp, then bias the single
+                xe = (uint32_t) (xes << 23); // Exponent
+                xm = ((uint32_t) hm) << 13; // Mantissa
+                *xp++ = (xs | xe | xm); // Combine sign bit, exponent bits, and mantissa bits
+            }
+        }
+    }
+}
+
+static void singles2halfp(void *target, void *source, long numel)
+{
+    uint16_t *hp = (uint16_t *) target; // Type pun output as an unsigned 16-bit int
+    uint32_t *xp = (uint32_t *) source; // Type pun input as an unsigned 32-bit int
+    uint16_t    hs, he, hm;
+    uint32_t x, xs, xe, xm;
+    int hes;
+    
+    if( source == NULL || target == NULL ) { // Nothing to convert (e.g., imag part of pure real)
+        return;
+    }
+    while( numel-- ) {
+        x = *xp++;
+        if( (x & 0x7FFFFFFFu) == 0 ) {  // Signed zero
+            *hp++ = (uint16_t) (x >> 16);  // Return the signed zero
+        } else { // Not zero
+            xs = x & 0x80000000u;  // Pick off sign bit
+            xe = x & 0x7F800000u;  // Pick off exponent bits
+            xm = x & 0x007FFFFFu;  // Pick off mantissa bits
+            if( xe == 0 ) {  // Denormal will underflow, return a signed zero
+                *hp++ = (uint16_t) (xs >> 16);
+            } else if( xe == 0x7F800000u ) {  // Inf or NaN (all the exponent bits are set)
+                if( xm == 0 ) { // If mantissa is zero ...
+                    *hp++ = (uint16_t) ((xs >> 16) | 0x7C00u); // Signed Inf
+                } else {
+                    *hp++ = (uint16_t) 0xFE00u; // NaN, only 1st mantissa bit set
+                }
+            } else { // Normalized number
+                hs = (uint16_t) (xs >> 16); // Sign bit
+                hes = ((int)(xe >> 23)) - 127 + 15; // Exponent unbias the single, then bias the halfp
+                if( hes >= 0x1F ) {  // Overflow
+                    *hp++ = (uint16_t) ((xs >> 16) | 0x7C00u); // Signed Inf
+                } else if( hes <= 0 ) {  // Underflow
+                    if( (14 - hes) > 24 ) {  // Mantissa shifted all the way off & no rounding possibility
+                        hm = (uint16_t) 0u;  // Set mantissa to zero
+                    } else {
+                        xm |= 0x00800000u;  // Add the hidden leading bit
+                        hm = (uint16_t) (xm >> (14 - hes)); // Mantissa
+                        if( (xm >> (13 - hes)) & 0x00000001u ) // Check for rounding
+                            hm += (uint16_t) 1u; // Round, might overflow into exp bit, but this is OK
+                    }
+                    *hp++ = (hs | hm); // Combine sign bit and mantissa bits, biased exponent is zero
+                } else {
+                    he = (uint16_t) (hes << 10); // Exponent
+                    hm = (uint16_t) (xm >> 13); // Mantissa
+                    if( xm & 0x00001000u ) // Check for rounding
+                        *hp++ = (hs | he | hm) + (uint16_t) 1u; // Round, might overflow to inf, this is OK
+                    else
+                        *hp++ = (hs | he | hm);  // No rounding
+                }
+            }
+        }
+    }
+}
+#endif
+
+//-----------------------------------------------------------------------------
+
+static void halfp2doubles(void *target, void *source, long numel)
+{
+    uint16_t *hp = (uint16_t *) source; // Type pun input as an unsigned 16-bit int
+    uint32_t *xp = (uint32_t *) target; // Type pun output as an unsigned 32-bit int
+    uint16_t h, hs, he, hm;
+    uint32_t xs, xe, xm;
+    int32_t xes;
+    int e;
+
+    xp += next;  // Little Endian adjustment if necessary
+    
+    if( source == NULL || target == NULL ) // Nothing to convert (e.g., imag part of pure real)
+        return;
+    while( numel-- ) {
+        h = *hp++;
+        if( (h & 0x7FFFu) == 0 ) {  // Signed zero
+            *xp++ = ((uint32_t) h) << 16;  // Return the signed zero
+        } else { // Not zero
+            hs = h & 0x8000u;  // Pick off sign bit
+            he = h & 0x7C00u;  // Pick off exponent bits
+            hm = h & 0x03FFu;  // Pick off mantissa bits
+            if( he == 0 ) {  // Denormal will convert to normalized
+                e = -1; // The following loop figures out how much extra to adjust the exponent
+                do {
+                    e++;
+                    hm <<= 1;
+                } while( (hm & 0x0400u) == 0 ); // Shift until leading bit overflows into exponent bit
+                xs = ((uint32_t) hs) << 16; // Sign bit
+                xes = ((int32_t) (he >> 10)) - 15 + 1023 - e; // Exponent unbias the halfp, then bias the double
+                xe = (uint32_t) (xes << 20); // Exponent
+                xm = ((uint32_t) (hm & 0x03FFu)) << 10; // Mantissa
+                *xp++ = (xs | xe | xm); // Combine sign bit, exponent bits, and mantissa bits
+            } else if( he == 0x7C00u ) {  // Inf or NaN (all the exponent bits are set)
+                if( hm == 0 ) { // If mantissa is zero ...
+                    *xp++ = (((uint32_t) hs) << 16) | ((uint32_t) 0x7FF00000u); // Signed Inf
+                } else {
+                    *xp++ = (uint32_t) 0xFFF80000u; // NaN, only the 1st mantissa bit set
+                }
+            } else {
+                xs = ((uint32_t) hs) << 16; // Sign bit
+                xes = ((int32_t) (he >> 10)) - 15 + 1023; // Exponent unbias the halfp, then bias the double
+                xe = (uint32_t) (xes << 20); // Exponent
+                xm = ((uint32_t) hm) << 10; // Mantissa
+                *xp++ = (xs | xe | xm); // Combine sign bit, exponent bits, and mantissa bits
+            }
+        }
+        xp++; // Skip over the remaining 32 bits of the mantissa
+    }
+}
+
+static long
+convert_double_half (char *src,
+                     char *dst,
+                     int   src_pitch,
+                     int   dst_pitch,
+                     long  n)
+{
+  while (n--)
+    {
+      doubles2halfp (dst, src, 1);
+      dst             += dst_pitch;
+      src             += src_pitch;
+    }
+  return n;
+}
+
+static long
+convert_half_double (char *src,
+                      char *dst,
+                      int   src_pitch,
+                      int   dst_pitch,
+                      long  n)
+{
+  while (n--)
+    {
+      halfp2doubles (dst, src, 1);
+      dst              += dst_pitch;
+      src              += src_pitch;
+    }
+  return n;
+}
+
+void
+babl_base_type_half (void)
+{
+  babl_type_new (
+    "half",
+    "id", BABL_HALF,
+    "bits", 16,
+    NULL);
+
+  babl_conversion_new (
+    babl_type_from_id (BABL_HALF),
+    babl_type_from_id (BABL_DOUBLE),
+    "plane", convert_half_double,
+    NULL
+  );
+
+  babl_conversion_new (
+    babl_type_from_id (BABL_DOUBLE),
+    babl_type_from_id (BABL_HALF),
+    "plane", convert_double_half,
+    NULL
+  );
+}
diff --git a/babl/base/type-u15.c b/babl/base/type-u15.c
new file mode 100644 (file)
index 0000000..47e3878
--- /dev/null
@@ -0,0 +1,136 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+#include <string.h>
+#include <stdint.h>
+#include <assert.h>
+#include <math.h>
+
+#include "babl-internal.h"
+#include "babl-base.h"
+
+
+static inline long
+convert_double_u15_scaled (double   min_val,
+                           double   max_val,
+                           uint16_t min,
+                           uint16_t max,
+                           char    *src,
+                           char    *dst,
+                           int      src_pitch,
+                           int      dst_pitch,
+                           long     n)
+{
+  while (n--)
+    {
+      double   dval = *(double *) src;
+      uint16_t u15val;
+
+      if (dval < min_val)
+        u15val = min;
+      else if (dval > max_val)
+        u15val = max;
+      else
+        u15val = rint ((dval - min_val) / (max_val - min_val) * (max - min) + min);
+
+      *(uint16_t *) dst = u15val;
+      dst              += dst_pitch;
+      src              += src_pitch;
+    }
+  return n;
+}
+
+static inline long
+convert_u15_double_scaled (double   min_val,
+                           double   max_val,
+                           uint16_t min,
+                           uint16_t max,
+                           char    *src,
+                           char    *dst,
+                           int      src_pitch,
+                           int      dst_pitch,
+                           long     n)
+{
+  while (n--)
+    {
+      int    u15val = *(uint16_t *) src;
+      double dval;
+
+      if (u15val < min)
+        dval = min_val;
+      else if (u15val > max)
+        dval = max_val;
+      else
+        dval = (u15val - min) / (double) (max - min) * (max_val - min_val) + min_val;
+
+      (*(double *) dst) = dval;
+      dst              += dst_pitch;
+      src              += src_pitch;
+    }
+  return n;
+}
+
+#define MAKE_CONVERSIONS(name, min_val, max_val, min, max)      \
+  static long \
+  convert_ ## name ## _double (void *src, \
+                               void *dst, \
+                               int src_pitch, \
+                               int dst_pitch, \
+                               long n)                               \
+  { \
+    return convert_u15_double_scaled (min_val, max_val, min, max, \
+                                      src, dst, src_pitch, dst_pitch, n); \
+  }                                                               \
+  static long \
+  convert_double_ ## name (void *src, \
+                           void *dst, \
+                           int src_pitch, \
+                           int dst_pitch, \
+                           long n)                                 \
+  { \
+    return convert_double_u15_scaled (min_val, max_val, min, max, \
+                                      src, dst, src_pitch, dst_pitch, n); \
+  }
+
+MAKE_CONVERSIONS (u15, 0.0, 1.0, 0, (1<<15))
+
+void
+babl_base_type_u15 (void)
+{
+  babl_hmpf_on_name_lookups--;
+  babl_type_new (
+    "u15",
+    "bits", 16,
+    NULL);
+
+  babl_conversion_new (
+    babl_type ("u15"),
+    babl_type_from_id (BABL_DOUBLE),
+    "plane", convert_u15_double,
+    NULL
+  );
+
+  babl_conversion_new (
+    babl_type_from_id (BABL_DOUBLE),
+    babl_type ("u15"),
+    "plane", convert_double_u15,
+    NULL
+  );
+  babl_hmpf_on_name_lookups++;
+}
index a229894562056d0cd3501b43152e5d0680b7a347..cfb17b0878e3c82822c448e44845b522262f29ae 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <assert.h>
 #include <math.h>
+#include "pow-24.h"
 
 /* Alpha threshold used in the reference implementation for
  * un-pre-multiplication of color data:
 #define BABL_USE_SRGB_GAMMA
 
 #ifdef BABL_USE_SRGB_GAMMA
-
-/*  fast approximation of x ^ (5/12) from a response by David Hammen at
- *  http://stackoverflow.com/questions/6475373/optimizations-for-pow-with-const-non-integer-exponent/6475516#6475516
- *
- */
-static inline double xpow512 (double x)
+static inline double
+linear_to_gamma_2_2 (double value)
 {
-  double cbrtx = cbrt(x);
-  return cbrtx*sqrt(sqrt(cbrtx));
+  if (value > 0.003130804954)
+    return 1.055 * pow (value, (1.0/2.4)) - 0.055;
+  return 12.92 * value;
 }
 
-
 static inline double
-linear_to_gamma_2_2 (double value)
+gamma_2_2_to_linear (double value)
 {
-#if 0
-  if (value > 0.0030402477F)
-    return 1.055F * pow (value, (1.0F/2.4F)) - 0.055F;
-  return 12.92F * value;
-#else
-  if (value > 0.0030402477F)
-    return 1.055F * xpow512 (value) - 0.055F;
-  return 12.92F * value;
-#endif
+  if (value > 0.04045)
+    return pow ((value + 0.055) / 1.055, 2.4);
+  return value / 12.92;
+}
+static inline double
+babl_linear_to_gamma_2_2 (double value)
+{
+  if (value > 0.003130804954)
+    return 1.055 * babl_pow_1_24 (value) - 0.055;
+  return 12.92 * value;
 }
 
 static inline double
-gamma_2_2_to_linear (double value)
+babl_gamma_2_2_to_linear (double value)
 {
-  if (value > 0.03928F)
-    return pow ((value + 0.055F) / 1.055F, 2.4F);
-  return value / 12.92F;
+  if (value > 0.04045)
+    return babl_pow_24 ((value + 0.055) / 1.055);
+  return value / 12.92;
 }
 
 #else
index 591fd2836cdf8fea498fe4241187c86504a1ed39..159ef0ab4ef1182c19858cc90033014bcc511c44 100644 (file)
 
 /* Define to 1 if SSE assembly is available. */
 #undef USE_SSE
+
+/* Define to 1 if SSE2 assembly is available. */
+#undef USE_SSE2
index c894da45500c4af1bf5688e713a8895622d18182..6205f8423d6aa0bb7c642d8970fa7b41d068317f 100755 (executable)
@@ -4,7 +4,7 @@
 #   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
 #   2011, 2012 Free Software Foundation, Inc.
 
-timestamp='2012-02-10'
+timestamp='2012-04-18'
 
 # This file is (in principle) common to ALL GNU software.
 # The presence of a machine in this file suggests that SOME GNU software
@@ -225,6 +225,12 @@ case $os in
        -isc*)
                basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
                ;;
+       -lynx*178)
+               os=-lynxos178
+               ;;
+       -lynx*5)
+               os=-lynxos5
+               ;;
        -lynx*)
                os=-lynxos
                ;;
@@ -1537,6 +1543,9 @@ case $basic_machine in
        c4x-* | tic4x-*)
                os=-coff
                ;;
+       hexagon-*)
+               os=-elf
+               ;;
        tic54x-*)
                os=-coff
                ;;
index 078dcc4da4d73c624014815cab879829aca23133..3f6fc98ee07a7e9301cf0736805374952993855c 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,11 +1,9 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for babl 0.1.10.
+# Generated by GNU Autoconf 2.69 for babl 0.1.12.
 #
 #
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
-# Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
 #
 #
 # This configure script is free software; the Free Software Foundation
@@ -134,6 +132,31 @@ export LANGUAGE
 # CDPATH.
 (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
 if test "x$CONFIG_SHELL" = x; then
   as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
@@ -167,7 +190,8 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
 else
   exitcode=1; echo positional parameters were not saved.
 fi
-test x\$exitcode = x0 || exit 1"
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
   as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
   as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
   eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
@@ -220,21 +244,25 @@ IFS=$as_save_IFS
 
 
       if test "x$CONFIG_SHELL" != x; then :
-  # We cannot yet assume a decent shell, so we have to provide a
-       # neutralization value for shells without unset; and this also
-       # works around shells that cannot unset nonexistent variables.
-       # Preserve -v and -x to the replacement shell.
-       BASH_ENV=/dev/null
-       ENV=/dev/null
-       (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-       export CONFIG_SHELL
-       case $- in # ((((
-         *v*x* | *x*v* ) as_opts=-vx ;;
-         *v* ) as_opts=-v ;;
-         *x* ) as_opts=-x ;;
-         * ) as_opts= ;;
-       esac
-       exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
 fi
 
     if test x$as_have_required = xno; then :
@@ -336,6 +364,14 @@ $as_echo X"$as_dir" |
 
 
 } # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
 # as_fn_append VAR VALUE
 # ----------------------
 # Append the text in VALUE to the end of the definition contained in VAR. Take
@@ -457,6 +493,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
   chmod +x "$as_me.lineno" ||
     { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
 
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
   # original and so on.  Autoconf is especially sensitive to this).
@@ -491,16 +531,16 @@ if (echo >conf$$.file) 2>/dev/null; then
     # ... but there are two gotchas:
     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
+    # In both cases, we have to default to `cp -pR'.
     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
+      as_ln_s='cp -pR'
   elif ln conf$$.file conf$$ 2>/dev/null; then
     as_ln_s=ln
   else
-    as_ln_s='cp -p'
+    as_ln_s='cp -pR'
   fi
 else
-  as_ln_s='cp -p'
+  as_ln_s='cp -pR'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
@@ -512,28 +552,8 @@ else
   as_mkdir_p=false
 fi
 
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-       test -d "$1/.";
-      else
-       case $1 in #(
-       -*)set "./$1";;
-       esac;
-       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-       ???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -567,8 +587,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='babl'
 PACKAGE_TARNAME='babl'
-PACKAGE_VERSION='0.1.10'
-PACKAGE_STRING='babl 0.1.10'
+PACKAGE_VERSION='0.1.12'
+PACKAGE_STRING='babl 0.1.12'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
@@ -613,7 +633,10 @@ ac_subst_vars='am__EXEEXT_FALSE
 am__EXEEXT_TRUE
 LTLIBOBJS
 LIBOBJS
+HAVE_SRANDOM_FALSE
+HAVE_SRANDOM_TRUE
 ALTIVEC_EXTRA_CFLAGS
+SSE2_EXTRA_CFLAGS
 SSE_EXTRA_CFLAGS
 MMX_EXTRA_CFLAGS
 OS_UNIX_FALSE
@@ -626,6 +649,8 @@ PATH_SEP
 PLATFORM_WIN32_FALSE
 PLATFORM_WIN32_TRUE
 SHREXT
+ENABLE_DOCS_FALSE
+ENABLE_DOCS_TRUE
 HAVE_W3M_FALSE
 HAVE_W3M_TRUE
 W3M
@@ -637,6 +662,7 @@ WEBSITE_HOST
 MAINT
 MAINTAINER_MODE_FALSE
 MAINTAINER_MODE_TRUE
+CPP
 OTOOL64
 OTOOL
 LIPO
@@ -655,19 +681,10 @@ FGREP
 EGREP
 GREP
 SED
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
 LIBTOOL
 OBJDUMP
 DLLTOOL
 AS
-CPP
 am__fastdepCC_FALSE
 am__fastdepCC_TRUE
 CCDEPMODE
@@ -712,27 +729,23 @@ am__isrc
 INSTALL_DATA
 INSTALL_SCRIPT
 INSTALL_PROGRAM
+target_os
+target_vendor
+target_cpu
+target
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
 BABL_CURRENT_MINUS_AGE
 BABL_LIBRARY_VERSION
 BABL_UNSTABLE
 BABL_UNSTABLE_FALSE
 BABL_UNSTABLE_TRUE
-HAVE_VALA_FALSE
-HAVE_VALA_TRUE
-VAPIGEN
-HAVE_INTROSPECTION_FALSE
-HAVE_INTROSPECTION_TRUE
-INTROSPECTION_MAKEFILE
-INTROSPECTION_LIBS
-INTROSPECTION_CFLAGS
-INTROSPECTION_TYPELIBDIR
-INTROSPECTION_GIRDIR
-INTROSPECTION_GENERATE
-INTROSPECTION_COMPILER
-INTROSPECTION_SCANNER
-PKG_CONFIG_LIBDIR
-PKG_CONFIG_PATH
-PKG_CONFIG
 BABL_RELEASE
 BABL_API_VERSION
 BABL_REAL_VERSION
@@ -783,8 +796,6 @@ SHELL'
 ac_subst_files=''
 ac_user_opts='
 enable_option_checking
-enable_introspection
-with_vala
 enable_silent_rules
 enable_dependency_tracking
 enable_static
@@ -795,16 +806,15 @@ with_gnu_ld
 with_sysroot
 enable_libtool_lock
 enable_maintainer_mode
+enable_docs
 enable_mmx
 enable_sse
+enable_sse2
 enable_altivec
 '
       ac_precious_vars='build_alias
 host_alias
 target_alias
-PKG_CONFIG
-PKG_CONFIG_PATH
-PKG_CONFIG_LIBDIR
 CC
 CFLAGS
 LDFLAGS
@@ -1266,8 +1276,6 @@ target=$target_alias
 if test "x$host_alias" != x; then
   if test "x$build_alias" = x; then
     cross_compiling=maybe
-    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used" >&2
   elif test "x$build_alias" != "x$host_alias"; then
     cross_compiling=yes
   fi
@@ -1353,7 +1361,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures babl 0.1.10 to adapt to many kinds of systems.
+\`configure' configures babl 0.1.12 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1418,12 +1426,13 @@ Program names:
 System types:
   --build=BUILD     configure for building on BUILD [guessed]
   --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+  --target=TARGET   configure for building compilers for TARGET [HOST]
 _ACEOF
 fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of babl 0.1.10:";;
+     short | recursive ) echo "Configuration of babl 0.1.12:";;
    esac
   cat <<\_ACEOF
 
@@ -1431,8 +1440,6 @@ Optional Features:
   --disable-option-checking  ignore unrecognized --enable/--with options
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-introspection=[no/auto/yes]
-                          Enable introspection for this build
   --enable-silent-rules          less verbose build output (undo: `make V=1')
   --disable-silent-rules         verbose build output (undo: `make V=0')
   --disable-dependency-tracking  speeds up one-time build
@@ -1444,14 +1451,15 @@ Optional Features:
   --disable-libtool-lock  avoid locking (might break parallel builds)
   --disable-maintainer-mode  disable make rules and dependencies not useful
                          (and sometimes confusing) to the casual installer
+  --disable-docs          disable docs generation (default=no)
   --enable-mmx            enable MMX support (default=auto)
   --enable-sse            enable SSE support (default=auto)
+  --enable-sse2            enable SSE2 support (default=auto)
   --enable-altivec        enable AltiVec support (default=auto)
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --without-vala         build without Vala support
   --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
                           both]
   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
@@ -1459,11 +1467,6 @@ Optional Packages:
                         (or the compiler's sysroot if not specified).
 
 Some influential environment variables:
-  PKG_CONFIG  path to pkg-config utility
-  PKG_CONFIG_PATH
-              directories to add to pkg-config's search path
-  PKG_CONFIG_LIBDIR
-              path overriding pkg-config's built-in search path
   CC          C compiler command
   CFLAGS      C compiler flags
   LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
@@ -1539,10 +1542,10 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-babl configure 0.1.10
-generated by GNU Autoconf 2.68
+babl configure 0.1.12
+generated by GNU Autoconf 2.69
 
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
@@ -1591,43 +1594,6 @@ fi
 
 } # ac_fn_c_try_compile
 
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } > conftest.i && {
-        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-        test ! -s conftest.err
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-    ac_retval=1
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
 # ac_fn_c_try_link LINENO
 # -----------------------
 # Try to link conftest.$ac_ext, and return whether this succeeded.
@@ -1655,7 +1621,7 @@ $as_echo "$ac_try_echo"; } >&5
         test ! -s conftest.err
        } && test -s conftest$ac_exeext && {
         test "$cross_compiling" = yes ||
-        $as_test_x conftest$ac_exeext
+        test -x conftest$ac_exeext
        }; then :
   ac_retval=0
 else
@@ -1705,6 +1671,43 @@ $as_echo "$ac_res" >&6; }
 
 } # ac_fn_c_check_header_compile
 
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
 # ac_fn_c_try_run LINENO
 # ----------------------
 # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
@@ -1904,8 +1907,8 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by babl $as_me 0.1.10, which was
-generated by GNU Autoconf 2.68.  Invocation command line was
+It was created by babl $as_me 0.1.12, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
 
@@ -2260,11 +2263,11 @@ ac_config_headers="$ac_config_headers config.h"
 
 BABL_MAJOR_VERSION=0
 BABL_MINOR_VERSION=1
-BABL_MICRO_VERSION=10
+BABL_MICRO_VERSION=12
 BABL_INTERFACE_AGE=1
-BABL_BINARY_AGE=110
-BABL_VERSION=0.1.10
-BABL_REAL_VERSION=0.1.10
+BABL_BINARY_AGE=112
+BABL_VERSION=0.1.12
+BABL_REAL_VERSION=0.1.12
 BABL_API_VERSION=0.1
 
 
@@ -2278,350 +2281,175 @@ BABL_API_VERSION=0.1
 BABL_RELEASE=0.1
 
 
-# GObject Introspection
-
-
-
-
-
-
+BABL_UNSTABLE=yes
+if test "x$BABL_UNSTABLE" = "xyes"; then
 
-if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
-       if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
-set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_PKG_CONFIG+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $PKG_CONFIG in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+$as_echo "#define BABL_UNSTABLE 1" >>confdefs.h
 
-  ;;
-esac
 fi
-PKG_CONFIG=$ac_cv_path_PKG_CONFIG
-if test -n "$PKG_CONFIG"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
-$as_echo "$PKG_CONFIG" >&6; }
+ if test "x$BABL_UNSTABLE" = "xyes"; then
+  BABL_UNSTABLE_TRUE=
+  BABL_UNSTABLE_FALSE='#'
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  BABL_UNSTABLE_TRUE='#'
+  BABL_UNSTABLE_FALSE=
 fi
 
 
-fi
-if test -z "$ac_cv_path_PKG_CONFIG"; then
-  ac_pt_PKG_CONFIG=$PKG_CONFIG
-  # Extract the first word of "pkg-config", so it can be a program name with args.
-set dummy pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $ac_pt_PKG_CONFIG in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
 
-  ;;
-esac
-fi
-ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
-if test -n "$ac_pt_PKG_CONFIG"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
-$as_echo "$ac_pt_PKG_CONFIG" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
 
-  if test "x$ac_pt_PKG_CONFIG" = x; then
-    PKG_CONFIG=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    PKG_CONFIG=$ac_pt_PKG_CONFIG
-  fi
-else
-  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
-fi
+# libtool versioning
 
-fi
-if test -n "$PKG_CONFIG"; then
-       _pkg_min_version=0.9.0
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
-$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
-       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
-               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-       else
-               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-               PKG_CONFIG=""
-       fi
-fi
 
 
+BABL_LIBRARY_VERSION="111:1:111"
+BABL_CURRENT_MINUS_AGE=0
 
-                # Check whether --enable-introspection was given.
-if test "${enable_introspection+set}" = set; then :
-  enableval=$enable_introspection;
-else
-  enable_introspection=no
-fi
 
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gobject-introspection" >&5
-$as_echo_n "checking for gobject-introspection... " >&6; }
 
-        case $enable_introspection in #(
-  no) :
-            found_introspection="no (disabled, use --enable-introspection to enable)"
-     ;; #(
-      yes) :
-            if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  :
-else
-  as_fn_error $? "gobject-introspection-1.0 is not installed" "$LINENO" 5
-fi
-        if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 0.10\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 0.10") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  found_introspection=yes
-else
-  as_fn_error $? "You need to have gobject-introspection >= 0.10 installed to build babl" "$LINENO" 5
-fi
-     ;; #(
-      auto) :
-            if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 0.10\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 0.10") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  found_introspection=yes
-else
-  found_introspection=no
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
 fi
-     ;; #(
-  *) :
-                as_fn_error $? "invalid argument passed to --enable-introspection, should be one of [no/auto/yes]" "$LINENO" 5
-     ;;
-esac
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $found_introspection" >&5
-$as_echo "$found_introspection" >&6; }
-
-    INTROSPECTION_SCANNER=
-    INTROSPECTION_COMPILER=
-    INTROSPECTION_GENERATE=
-    INTROSPECTION_GIRDIR=
-    INTROSPECTION_TYPELIBDIR=
-    if test "x$found_introspection" = "xyes"; then
-       INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
-       INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
-       INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
-       INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
-       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
-       INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
-       INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
-       INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
-    fi
-
-
-
-
-
 
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
 
 
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
 
-     if test "x$found_introspection" = "xyes"; then
-  HAVE_INTROSPECTION_TRUE=
-  HAVE_INTROSPECTION_FALSE='#'
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  HAVE_INTROSPECTION_TRUE='#'
-  HAVE_INTROSPECTION_FALSE=
-fi
-
-
-
-
-# Vala
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
 
-# Check whether --with-vala was given.
-if test "${with_vala+set}" = set; then :
-  withval=$with_vala;
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
 
 
-have_vapigen="no"
-if test "x$with_vala" != "xno"; then
-
-  # Extract the first word of "vapigen", so it can be a program name with args.
-set dummy vapigen; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_VAPIGEN+:} false; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  case $VAPIGEN in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_VAPIGEN="$VAPIGEN" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_path_VAPIGEN="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-  test -z "$ac_cv_path_VAPIGEN" && ac_cv_path_VAPIGEN="no"
-  ;;
-esac
-fi
-VAPIGEN=$ac_cv_path_VAPIGEN
-if test -n "$VAPIGEN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VAPIGEN" >&5
-$as_echo "$VAPIGEN" >&6; }
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  if test "$VAPIGEN" = "no"; then
-    have_vapigen="no  (vapigen executable not found)"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: *** Check for vapigen failed." >&5
-$as_echo "*** Check for vapigen failed." >&6; }
-  else
-    have_vapigen="yes"
-  fi
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
 fi
 
-have_vala=$have_vapigen
- if test "$have_vala" = "yes"; then
-  HAVE_VALA_TRUE=
-  HAVE_VALA_FALSE='#'
-else
-  HAVE_VALA_TRUE='#'
-  HAVE_VALA_FALSE=
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
 
 
-BABL_UNSTABLE=yes
-if test "x$BABL_UNSTABLE" = "xyes"; then
-
-$as_echo "#define BABL_UNSTABLE 1" >>confdefs.h
-
-fi
- if test "x$BABL_UNSTABLE" = "xyes"; then
-  BABL_UNSTABLE_TRUE=
-  BABL_UNSTABLE_FALSE='#'
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+$as_echo_n "checking target system type... " >&6; }
+if ${ac_cv_target+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  BABL_UNSTABLE_TRUE='#'
-  BABL_UNSTABLE_FALSE=
+  if test "x$target_alias" = x; then
+  ac_cv_target=$ac_cv_host
+else
+  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
 fi
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+$as_echo "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
 
 
-
-# libtool versioning
-
-
-
-BABL_LIBRARY_VERSION="109:1:109"
-BABL_CURRENT_MINUS_AGE=0
-
-
-
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+  test "$program_prefix$program_suffix$program_transform_name" = \
+    NONENONEs,x,x, &&
+  program_prefix=${target_alias}-
 
 am__api_version='1.11'
 
-ac_aux_dir=
-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
-  if test -f "$ac_dir/install-sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f "$ac_dir/install.sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  elif test -f "$ac_dir/shtool"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/shtool install -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
-  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
-
-
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
 # incompatible versions:
@@ -2659,7 +2487,7 @@ case $as_dir/ in #((
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+       if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
          if test $ac_prog = install &&
            grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
            # AIX install.  It has an incompatible calling convention.
@@ -2828,7 +2656,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2868,7 +2696,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_STRIP="strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2919,7 +2747,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_prog in mkdir gmkdir; do
         for ac_exec_ext in '' $ac_executable_extensions; do
-          { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+          as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
           case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
             'mkdir (GNU coreutils) '* | \
             'mkdir (coreutils) '* | \
@@ -2972,7 +2800,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_AWK="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3058,7 +2886,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='babl'
- VERSION='0.1.10'
+ VERSION='0.1.12'
 
 
 # Some tools Automake needs.
@@ -3133,69 +2961,32 @@ fi
 AM_BACKSLASH='\'
 
 
-DEPDIR="${am__leading_dot}deps"
-
-ac_config_commands="$ac_config_commands depfiles"
-
+# Prefer clang on OSX, because GCC isn't updated
 
-am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-       @echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
-$as_echo_n "checking for style of include used by $am_make... " >&6; }
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
+case "$build_os" in
+  darwin10.* | darwin9.* | darwin8.*)
+    ;;
+  darwin*)
+    prefered_cc="clang"
+    prefered_cxx="clang++"
+    ;;
+  *)
+    ;;
 esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
-$as_echo "$_am_result" >&6; }
-rm -f confinc confmf
 
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
-  enableval=$enable_dependency_tracking;
+if test -z "$CC" && test -n "$prefered_cc"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: setting CC to $prefered_cc for $build_os" >&5
+$as_echo "$as_me: setting CC to $prefered_cc for $build_os" >&6;}
+  CC=$prefered_cc
 fi
 
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-  am__nodep='_no'
-fi
- if test "x$enable_dependency_tracking" != xno; then
-  AMDEP_TRUE=
-  AMDEP_FALSE='#'
-else
-  AMDEP_TRUE='#'
-  AMDEP_FALSE=
+if test -z "$CXX" && test -n "$prefered_cc"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: setting CXX to $prefered_cxx for $build_os" >&5
+$as_echo "$as_me: setting CXX to $prefered_cxx for $build_os" >&6;}
+  CXX=$prefered_cxx
 fi
 
-
+# Check for programs
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -3218,7 +3009,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3258,7 +3049,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CC="gcc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3311,7 +3102,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3352,7 +3143,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
        continue
@@ -3410,7 +3201,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3454,7 +3245,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3900,8 +3691,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <stdarg.h>
 #include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
+struct stat;
 /* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
 struct buf { int x; };
 FILE * (*rcsopen) (struct buf *, struct stat *, int);
@@ -3985,904 +3775,69 @@ ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
 
-depcc="$CC"   am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if ${am_cv_CC_dependencies_compiler_type+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CC_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  am__universal=false
-  case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac
+ac_config_commands="$ac_config_commands depfiles"
 
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-       continue
-      else
-       break
-      fi
-      ;;
-    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CC_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
-  am__fastdepCC_TRUE=
-  am__fastdepCC_FALSE='#'
-else
-  am__fastdepCC_TRUE='#'
-  am__fastdepCC_FALSE=
-fi
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if ${ac_cv_prog_CPP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-                    Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CPP=$CPP
-
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-                    Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNUC variadic macros" >&5
-$as_echo_n "checking for GNUC variadic macros... " >&6; }
-if ${babl_cv_prog_gnuc_variadic_macros+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  # gcc-2.95.x supports both gnu style and ISO varargs, but if -ansi
-    # is passed ISO vararg support is turned off, and there is no work
-    # around to turn it on, so we unconditionally turn it off.
-    { echo '#if __GNUC__ == 2 && __GNUC_MINOR__ == 95'
-      echo ' yes '
-      echo '#endif'; } > conftest.c
-    if ${CPP} conftest.c | grep yes > /dev/null; then
-        babl_cv_prog_c_variadic_macros=no
-        babl_cv_prog_cxx_variadic_macros=no
-    fi
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-int a(int p1, int p2, int p3);
-#define call_a(params...) a(1,params)
-call_a(2,3);
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  babl_cv_prog_gnuc_variadic_macros=yes
-else
-  babl_cv_prog_gnuc_variadic_macros=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $babl_cv_prog_gnuc_variadic_macros" >&5
-$as_echo "$babl_cv_prog_gnuc_variadic_macros" >&6; }
-if test x$babl_cv_prog_gnuc_variadic_macros = xyes; then
-
-$as_echo "#define BABL_GNUC_VARIADIC_MACROS 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 variadic macros in C" >&5
-$as_echo_n "checking for ISO C99 variadic macros in C... " >&6; }
-if ${babl_cv_prog_c_variadic_macros+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-int a(int p1, int p2, int p3);
-#define call_a(...) a(1,__VA_ARGS__)
-call_a(2,3);
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  babl_cv_prog_c_variadic_macros=yes
-else
-  babl_cv_prog_c_variadic_macros=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $babl_cv_prog_c_variadic_macros" >&5
-$as_echo "$babl_cv_prog_c_variadic_macros" >&6; }
-if test x$babl_cv_prog_c_variadic_macros = xyes ; then
-
-$as_echo "#define BABL_ISO_VARIADIC_MACROS 1" >>confdefs.h
-
-fi
-
-# No C++ compiler
-    babl_cv_prog_cxx_variadic_macros=no
-if test x$babl_cv_prog_cxx_variadic_macros = xyes ; then
-
-$as_echo "#define BABL_ISO_CXX_VARIADIC_MACROS 1" >>confdefs.h
-
-fi
-
-
-# Check for programs
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-          if test -n "$ac_tool_prefix"; then
-    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  fi
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl.exe
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl.exe
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CC" && break
-done
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-  fi
-  rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GCC=yes
-else
-  GCC=
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
 fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_c_werror_flag=$ac_c_werror_flag
-   ac_c_werror_flag=yes
-   ac_cv_prog_cc_g=no
-   CFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-else
-  CFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
 
-else
-  ac_c_werror_flag=$ac_save_c_werror_flag
-        CFLAGS="-g"
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
 
-int
-main ()
-{
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
 
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
-   inside strings and character constants.  */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_c89=$ac_arg
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
 fi
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
 fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    CC="$CC $ac_cv_prog_cc_c89"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
 
-fi
 
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 depcc="$CC"   am_compiler_list=
 
@@ -4990,25 +3945,202 @@ else
     fi
   done
 
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CC_dependencies_compiler_type=none
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5
+$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
+if ${ac_cv_prog_cc_c99+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <stdio.h>
+
+// Check varargs macros.  These examples are taken from C99 6.10.3.5.
+#define debug(...) fprintf (stderr, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+  int x = 1234;
+  int y = 5678;
+  debug ("Flag");
+  debug ("X = %d\n", x);
+  showlist (The first, second, and third items.);
+  report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+  your preprocessor is broken;
+#endif
+#if BIG_OK
+#else
+  your preprocessor is broken;
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+  int datasize;
+  double data[];
+};
+
+struct named_init {
+  int number;
+  const wchar_t *name;
+  double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+  // See if C++-style comments work.
+  // Iterate through items via the restricted pointer.
+  // Also check for declarations in for loops.
+  for (unsigned int i = 0; *(text+i) != '\0'; ++i)
+    continue;
+  return 0;
+}
+
+// Check varargs and va_copy.
+static void
+test_varargs (const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+  va_list args_copy;
+  va_copy (args_copy, args);
+
+  const char *str;
+  int number;
+  float fnumber;
+
+  while (*format)
+    {
+      switch (*format++)
+       {
+       case 's': // string
+         str = va_arg (args_copy, const char *);
+         break;
+       case 'd': // int
+         number = va_arg (args_copy, int);
+         break;
+       case 'f': // float
+         fnumber = va_arg (args_copy, double);
+         break;
+       default:
+         break;
+       }
+    }
+  va_end (args_copy);
+  va_end (args);
+}
+
+int
+main ()
+{
+
+  // Check bool.
+  _Bool success = false;
+
+  // Check restrict.
+  if (test_restrict ("String literal") == 0)
+    success = true;
+  char *restrict newvar = "Another string";
+
+  // Check varargs.
+  test_varargs ("s, d' f .", "string", 65, 34.234);
+  test_varargs_macros ();
+
+  // Check flexible array members.
+  struct incomplete_array *ia =
+    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+  ia->datasize = 10;
+  for (int i = 0; i < ia->datasize; ++i)
+    ia->data[i] = i * 1.234;
+
+  // Check named initializers.
+  struct named_init ni = {
+    .number = 34,
+    .name = L"Test wide string",
+    .average = 543.34343,
+  };
+
+  ni.number = 58;
+
+  int dynamic_array[ni.number];
+  dynamic_array[ni.number - 1] = 543;
+
+  // work around unused variable warnings
+  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
+         || dynamic_array[ni.number - 1] != 543);
+
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c99=$ac_arg
 fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c99" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c99"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c99" != xno; then :
 
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
-  am__fastdepCC_TRUE=
-  am__fastdepCC_FALSE='#'
-else
-  am__fastdepCC_TRUE='#'
-  am__fastdepCC_FALSE=
 fi
 
 
@@ -5040,77 +4172,6 @@ macro_revision='1.3337'
 
 ltmain="$ac_aux_dir/ltmain.sh"
 
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
 # Backslashify metacharacters that are still active within
 # double-quoted strings.
 sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
@@ -5202,7 +4263,7 @@ do
     for ac_prog in sed gsed; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+      as_fn_executable_p "$ac_path_SED" || continue
 # Check for GNU ac_path_SED and select it if it is found.
   # Check for GNU $ac_path_SED
 case `"$ac_path_SED" --version 2>&1` in
@@ -5278,7 +4339,7 @@ do
     for ac_prog in grep ggrep; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+      as_fn_executable_p "$ac_path_GREP" || continue
 # Check for GNU ac_path_GREP and select it if it is found.
   # Check for GNU $ac_path_GREP
 case `"$ac_path_GREP" --version 2>&1` in
@@ -5344,7 +4405,7 @@ do
     for ac_prog in egrep; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+      as_fn_executable_p "$ac_path_EGREP" || continue
 # Check for GNU ac_path_EGREP and select it if it is found.
   # Check for GNU $ac_path_EGREP
 case `"$ac_path_EGREP" --version 2>&1` in
@@ -5411,7 +4472,7 @@ do
     for ac_prog in fgrep; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+      as_fn_executable_p "$ac_path_FGREP" || continue
 # Check for GNU ac_path_FGREP and select it if it is found.
   # Check for GNU $ac_path_FGREP
 case `"$ac_path_FGREP" --version 2>&1` in
@@ -5667,7 +4728,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -5711,7 +4772,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6135,7 +5196,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6175,7 +5236,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_OBJDUMP="objdump"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6298,10 +5359,6 @@ freebsd* | dragonfly*)
   fi
   ;;
 
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
 haiku*)
   lt_cv_deplibs_check_method=pass_all
   ;;
@@ -6340,7 +5397,7 @@ irix5* | irix6* | nonstopux*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
@@ -6478,7 +5535,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6518,7 +5575,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_DLLTOOL="dlltool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6599,6 +5656,7 @@ test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
 
 
 
+
 if test -n "$ac_tool_prefix"; then
   for ac_prog in ar
   do
@@ -6618,7 +5676,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6662,7 +5720,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_AR="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6787,7 +5845,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6827,7 +5885,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_STRIP="strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6886,7 +5944,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6926,7 +5984,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_RANLIB="ranlib"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7575,7 +6633,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7615,7 +6673,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7695,7 +6753,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7735,7 +6793,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7787,7 +6845,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7827,7 +6885,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_NMEDIT="nmedit"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7879,7 +6937,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7919,7 +6977,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_LIPO="lipo"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7971,7 +7029,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -8011,7 +7069,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_OTOOL="otool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -8063,7 +7121,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -8103,7 +7161,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_OTOOL64="otool64"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -8302,6 +7360,143 @@ $as_echo "$lt_cv_ld_force_load" >&6; }
     ;;
   esac
 
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
 $as_echo_n "checking for ANSI C header files... " >&6; }
@@ -8500,7 +7695,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_AS="${ac_tool_prefix}as"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -8540,7 +7735,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_AS="as"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -8592,7 +7787,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -8632,7 +7827,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_DLLTOOL="dlltool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -8684,7 +7879,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -8724,7 +7919,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_OBJDUMP="objdump"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -9423,7 +8618,7 @@ lt_prog_compiler_static=
       lt_prog_compiler_static='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -11593,17 +10788,6 @@ freebsd* | dragonfly*)
   esac
   ;;
 
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
 haiku*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
@@ -11720,7 +10904,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
@@ -12768,6 +11952,97 @@ CC="$lt_save_CC"
 
 
 
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNUC variadic macros" >&5
+$as_echo_n "checking for GNUC variadic macros... " >&6; }
+if ${babl_cv_prog_gnuc_variadic_macros+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # gcc-2.95.x supports both gnu style and ISO varargs, but if -ansi
+    # is passed ISO vararg support is turned off, and there is no work
+    # around to turn it on, so we unconditionally turn it off.
+    { echo '#if __GNUC__ == 2 && __GNUC_MINOR__ == 95'
+      echo ' yes '
+      echo '#endif'; } > conftest.c
+    if ${CPP} conftest.c | grep yes > /dev/null; then
+        babl_cv_prog_c_variadic_macros=no
+        babl_cv_prog_cxx_variadic_macros=no
+    fi
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+int a(int p1, int p2, int p3);
+#define call_a(params...) a(1,params)
+call_a(2,3);
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  babl_cv_prog_gnuc_variadic_macros=yes
+else
+  babl_cv_prog_gnuc_variadic_macros=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $babl_cv_prog_gnuc_variadic_macros" >&5
+$as_echo "$babl_cv_prog_gnuc_variadic_macros" >&6; }
+if test x$babl_cv_prog_gnuc_variadic_macros = xyes; then
+
+$as_echo "#define BABL_GNUC_VARIADIC_MACROS 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 variadic macros in C" >&5
+$as_echo_n "checking for ISO C99 variadic macros in C... " >&6; }
+if ${babl_cv_prog_c_variadic_macros+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+int a(int p1, int p2, int p3);
+#define call_a(...) a(1,__VA_ARGS__)
+call_a(2,3);
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  babl_cv_prog_c_variadic_macros=yes
+else
+  babl_cv_prog_c_variadic_macros=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $babl_cv_prog_c_variadic_macros" >&5
+$as_echo "$babl_cv_prog_c_variadic_macros" >&6; }
+if test x$babl_cv_prog_c_variadic_macros = xyes ; then
+
+$as_echo "#define BABL_ISO_VARIADIC_MACROS 1" >>confdefs.h
+
+fi
+
+# No C++ compiler
+    babl_cv_prog_cxx_variadic_macros=no
+if test x$babl_cv_prog_cxx_variadic_macros = xyes ; then
+
+$as_echo "#define BABL_ISO_CXX_VARIADIC_MACROS 1" >>confdefs.h
+
+fi
+
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
     # Check whether --enable-maintainer-mode was given.
@@ -13186,8 +12461,8 @@ CFLAGS="$CFLAGS $extra_warnings"
 
 fi
 
-# Extract the first word of "rsvg", so it can be a program name with args.
-set dummy rsvg; ac_word=$2
+# Extract the first word of "rsvg-convert", so it can be a program name with args.
+set dummy rsvg-convert; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_RSVG+:} false; then :
@@ -13204,7 +12479,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_path_RSVG="$as_dir/$ac_word$ac_exec_ext"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -13254,7 +12529,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_path_W3M="$as_dir/$ac_word$ac_exec_ext"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -13286,6 +12561,23 @@ else
 fi
 
 
+# Check whether --enable-docs was given.
+if test "${enable_docs+set}" = set; then :
+  enableval=$enable_docs;
+else
+  enable_docs="yes"
+fi
+
+
+ if test "x$enable_docs" = "xyes"; then
+  ENABLE_DOCS_TRUE=
+  ENABLE_DOCS_FALSE='#'
+else
+  ENABLE_DOCS_TRUE='#'
+  ENABLE_DOCS_FALSE=
+fi
+
+
 ###########################
 # Check target architecture
 ###########################
@@ -13341,12 +12633,9 @@ esac
 # Check how to find plug-ins
 ############################
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for some Win32 platform" >&5
-$as_echo_n "checking for some Win32 platform... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the extension for shared libraries" >&5
+$as_echo_n "checking the extension for shared libraries... " >&6; }
 case "$target_or_host" in
-  *-*-darwin*)                 # darwin
-    shrext=.dylib
-    ;;
   hppa*-hpux*)                # HP/UX
     shrext=.sl
     ;;
@@ -13365,6 +12654,8 @@ cat >>confdefs.h <<_ACEOF
 #define SHREXT "$shrext"
 _ACEOF
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $shrext" >&5
+$as_echo "$shrext" >&6; }
 
 
 #################
@@ -13454,6 +12745,14 @@ else
 fi
 
 
+# Check whether --enable-sse2 was given.
+if test "${enable_sse2+set}" = set; then :
+  enableval=$enable_sse2;
+else
+  enable_sse2=$enable_sse
+fi
+
+
 if test "x$enable_mmx" = xyes; then
 
   MMX_EXTRA_CFLAGS=
@@ -13490,6 +12789,7 @@ $as_echo "$MMX_EXTRA_CFLAGS_works" >&6; }
   done
 
   SSE_EXTRA_CFLAGS=
+  SSE2_EXTRA_CFLAGS=
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can compile MMX code" >&5
 $as_echo_n "checking whether we can compile MMX code... " >&6; }
@@ -13517,6 +12817,78 @@ $as_echo "yes" >&6; }
 
     if test "x$enable_sse" = xyes; then
 
+  fpmath_flag=
+  for flag in '-mfpmath=sse'; do
+    if test -z "$fpmath_flag"; then
+      fpmath_flag_save_CFLAGS="$CFLAGS"
+      CFLAGS="$CFLAGS $flag"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands $flag" >&5
+$as_echo_n "checking whether $CC understands $flag... " >&6; }
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  fpmath_flag_works=yes
+else
+  fpmath_flag_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $fpmath_flag_works" >&5
+$as_echo "$fpmath_flag_works" >&6; }
+      CFLAGS="$fpmath_flag_save_CFLAGS"
+      if test "x$fpmath_flag_works" = "xyes"; then
+        fpmath_flag="$flag"
+      fi
+    fi
+  done
+
+      if test "x$platform_win32" = xyes; then
+
+  stack_align=
+  for flag in '-mstackrealign'; do
+    if test -z "$stack_align"; then
+      stack_align_save_CFLAGS="$CFLAGS"
+      CFLAGS="$CFLAGS $flag"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands $flag" >&5
+$as_echo_n "checking whether $CC understands $flag... " >&6; }
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  stack_align_works=yes
+else
+  stack_align_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $stack_align_works" >&5
+$as_echo "$stack_align_works" >&6; }
+      CFLAGS="$stack_align_save_CFLAGS"
+      if test "x$stack_align_works" = "xyes"; then
+        stack_align="$flag"
+      fi
+    fi
+  done
+
+      fi
+      SSE_EXTRA_CFLAGS="$MMX_EXTRA_CFLAGS $stack_align $fpmath_flag"
+
+
   sse_flag=
   for flag in '-msse'; do
     if test -z "$sse_flag"; then
@@ -13550,7 +12922,7 @@ $as_echo "$sse_flag_works" >&6; }
     fi
   done
 
-      SSE_EXTRA_CFLAGS="$MMX_EXTRA_CFLAGS $sse_flag"
+      SSE_EXTRA_CFLAGS="$SSE_EXTRA_CFLAGS $sse_flag"
 
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can compile SSE code" >&5
 $as_echo_n "checking whether we can compile SSE code... " >&6; }
@@ -13585,6 +12957,77 @@ $as_echo "$as_me: WARNING: The assembler does not support the SSE command set."
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
+      if test "x$enable_sse2" = xyes; then
+
+  sse2_flag=
+  for flag in '-msse2'; do
+    if test -z "$sse2_flag"; then
+      sse2_flag_save_CFLAGS="$CFLAGS"
+      CFLAGS="$CFLAGS $flag"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands $flag" >&5
+$as_echo_n "checking whether $CC understands $flag... " >&6; }
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  sse2_flag_works=yes
+else
+  sse2_flag_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sse2_flag_works" >&5
+$as_echo "$sse2_flag_works" >&6; }
+      CFLAGS="$sse2_flag_save_CFLAGS"
+      if test "x$sse2_flag_works" = "xyes"; then
+        sse2_flag="$flag"
+      fi
+    fi
+  done
+
+        SSE2_EXTRA_CFLAGS="$SSE_EXTRA_CFLAGS $sse2_flag"
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can compile SSE2 code" >&5
+$as_echo_n "checking whether we can compile SSE2 code... " >&6; }
+
+        CFLAGS="$CFLAGS $sse2_flag"
+
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+asm ("punpckhwd %xmm0,%xmm1");
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+$as_echo "#define USE_SSE2 1" >>confdefs.h
+
+          { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+  enable_sse2=no
+          { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The assembler does not support the SSE2 command set." >&5
+$as_echo "$as_me: WARNING: The assembler does not support the SSE2 command set." >&2;}
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+      fi
+
     fi
 
 else
@@ -13601,6 +13044,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 
 
+
 fi
 
 
@@ -13733,6 +13177,24 @@ $as_echo "$as_me: WARNING: The assembler does not support the AltiVec command se
 fi
 
 
+##################
+# Check for random
+##################
+have_srandom=no
+ac_fn_c_check_func "$LINENO" "srandom" "ac_cv_func_srandom"
+if test "x$ac_cv_func_srandom" = xyes; then :
+  have_srandom=yes
+fi
+
+ if test x$have_srandom = xyes; then
+  HAVE_SRANDOM_TRUE=
+  HAVE_SRANDOM_FALSE='#'
+else
+  HAVE_SRANDOM_TRUE='#'
+  HAVE_SRANDOM_FALSE=
+fi
+
+
 
 for ac_header in dl.h
 do :
@@ -13908,7 +13370,7 @@ _ACEOF
 
 
 
-ac_config_files="$ac_config_files Makefile babl.pc babl/Makefile babl/babl-version.h babl/base/Makefile docs/Makefile docs/index-static.html docs/graphics/Makefile tests/Makefile extensions/Makefile INSTALL"
+ac_config_files="$ac_config_files Makefile babl.pc babl/Makefile babl/babl-version.h babl/base/Makefile docs/Makefile docs/index-static.html docs/graphics/Makefile tests/Makefile tools/Makefile extensions/Makefile INSTALL"
 
 
 cat >confcache <<\_ACEOF
@@ -14020,14 +13482,6 @@ LIBOBJS=$ac_libobjs
 LTLIBOBJS=$ac_ltlibobjs
 
 
-if test -z "${HAVE_INTROSPECTION_TRUE}" && test -z "${HAVE_INTROSPECTION_FALSE}"; then
-  as_fn_error $? "conditional \"HAVE_INTROSPECTION\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${HAVE_VALA_TRUE}" && test -z "${HAVE_VALA_FALSE}"; then
-  as_fn_error $? "conditional \"HAVE_VALA\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
 if test -z "${BABL_UNSTABLE_TRUE}" && test -z "${BABL_UNSTABLE_FALSE}"; then
   as_fn_error $? "conditional \"BABL_UNSTABLE\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -14048,10 +13502,6 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
   as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
 if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
   as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -14064,6 +13514,10 @@ if test -z "${HAVE_W3M_TRUE}" && test -z "${HAVE_W3M_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_W3M\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${ENABLE_DOCS_TRUE}" && test -z "${ENABLE_DOCS_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_DOCS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${PLATFORM_WIN32_TRUE}" && test -z "${PLATFORM_WIN32_FALSE}"; then
   as_fn_error $? "conditional \"PLATFORM_WIN32\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -14076,6 +13530,10 @@ if test -z "${OS_UNIX_TRUE}" && test -z "${OS_UNIX_FALSE}"; then
   as_fn_error $? "conditional \"OS_UNIX\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${HAVE_SRANDOM_TRUE}" && test -z "${HAVE_SRANDOM_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_SRANDOM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 
 : "${CONFIG_STATUS=./config.status}"
 ac_write_fail=0
@@ -14374,16 +13832,16 @@ if (echo >conf$$.file) 2>/dev/null; then
     # ... but there are two gotchas:
     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
+    # In both cases, we have to default to `cp -pR'.
     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
+      as_ln_s='cp -pR'
   elif ln conf$$.file conf$$ 2>/dev/null; then
     as_ln_s=ln
   else
-    as_ln_s='cp -p'
+    as_ln_s='cp -pR'
   fi
 else
-  as_ln_s='cp -p'
+  as_ln_s='cp -pR'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
@@ -14443,28 +13901,16 @@ else
   as_mkdir_p=false
 fi
 
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-       test -d "$1/.";
-      else
-       case $1 in #(
-       -*)set "./$1";;
-       esac;
-       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-       ???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -14485,8 +13931,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by babl $as_me 0.1.10, which was
-generated by GNU Autoconf 2.68.  Invocation command line was
+This file was extended by babl $as_me 0.1.12, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -14551,11 +13997,11 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-babl config.status 0.1.10
-configured by $0, generated by GNU Autoconf 2.68,
+babl config.status 0.1.12
+configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
 
@@ -14646,7 +14092,7 @@ fi
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 if \$ac_cs_recheck; then
-  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
   shift
   \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
   CONFIG_SHELL='$SHELL'
@@ -14971,6 +14417,7 @@ do
     "docs/index-static.html") CONFIG_FILES="$CONFIG_FILES docs/index-static.html" ;;
     "docs/graphics/Makefile") CONFIG_FILES="$CONFIG_FILES docs/graphics/Makefile" ;;
     "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
+    "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;;
     "extensions/Makefile") CONFIG_FILES="$CONFIG_FILES extensions/Makefile" ;;
     "INSTALL") CONFIG_FILES="$CONFIG_FILES INSTALL" ;;
 
index 26b02dabd2247a8aefb641422d8781085af3f3bf..b07d4d5f3d6d1e2a4bd5167cb79074b1c0b7e65e 100644 (file)
@@ -14,7 +14,7 @@ AC_PREREQ(2.54)
 
 m4_define([babl_major_version], [0])
 m4_define([babl_minor_version], [1])
-m4_define([babl_micro_version], [10])
+m4_define([babl_micro_version], [12])
 m4_define([babl_real_version],
           [babl_major_version.babl_minor_version.babl_micro_version])
 m4_define([babl_version], [babl_real_version])
@@ -61,27 +61,6 @@ AC_SUBST(BABL_API_VERSION)
 BABL_RELEASE=babl_api_version
 AC_SUBST(BABL_RELEASE)
 
-# GObject Introspection
-GOBJECT_INTROSPECTION_CHECK([0.10])
-
-# Vala
-AC_ARG_WITH(vala, [  --without-vala         build without Vala support])
-
-have_vapigen="no"
-if test "x$with_vala" != "xno"; then
-
-  AC_PATH_PROG(VAPIGEN, vapigen, no)
-  if test "$VAPIGEN" = "no"; then
-    have_vapigen="no  (vapigen executable not found)"
-    AC_MSG_RESULT([*** Check for vapigen failed.])
-  else
-    have_vapigen="yes"
-  fi
-fi
-
-have_vala=$have_vapigen
-AM_CONDITIONAL(HAVE_VALA, test "$have_vala" = "yes")
-
 dnl The symbol BABL_UNSTABLE is defined above for substitution in
 dnl Makefiles and conditionally defined here as a preprocessor symbol
 dnl and automake conditional.
@@ -105,6 +84,7 @@ AC_SUBST(BABL_CURRENT_MINUS_AGE)
 
 dnl ==========================================================================
 
+AC_CANONICAL_SYSTEM
 AM_INIT_AUTOMAKE([1.11 foreign no-define dist-bzip2 no-dist-gzip -Wno-portability])
 
 # Enable silent build rules by default, requires at least
@@ -112,15 +92,39 @@ AM_INIT_AUTOMAKE([1.11 foreign no-define dist-bzip2 no-dist-gzip -Wno-portabilit
 # configure or passing V=1 to make
 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
 
-BABL_VARIADIC_MACROS
+# Prefer clang on OSX, because GCC isn't updated
+
+case "$build_os" in
+  darwin10.* | darwin9.* | darwin8.*)
+    ;;
+  darwin*)
+    prefered_cc="clang"
+    prefered_cxx="clang++"
+    ;;
+  *)
+    ;;
+esac
+
+if test -z "$CC" && test -n "$prefered_cc"; then
+  AC_MSG_NOTICE([setting CC to $prefered_cc for $build_os])
+  CC=$prefered_cc
+fi
+
+if test -z "$CXX" && test -n "$prefered_cc"; then
+  AC_MSG_NOTICE([setting CXX to $prefered_cxx for $build_os])
+  CXX=$prefered_cxx
+fi
 
 # Check for programs
 AC_PROG_CC
+AC_PROG_CC_C99
 
 # Initialize libtool
 LT_PREREQ([2.2])
 LT_INIT([disable-static win32-dll])
 
+BABL_VARIADIC_MACROS
+
 dnl Initialize maintainer mode
 AM_MAINTAINER_MODE([enable])
 
@@ -159,12 +163,19 @@ CFLAGS="$CFLAGS $extra_warnings"
 
 fi
 
-AC_PATH_PROG(RSVG, rsvg, no)
+AC_PATH_PROG(RSVG, rsvg-convert, no)
 AM_CONDITIONAL(HAVE_RSVG, test "x$RSVG" != "xno")
 
 AC_PATH_PROG(W3M, w3m, no)
 AM_CONDITIONAL(HAVE_W3M, test "x$W3M" != "xno")
 
+dnl disable docs generation.
+AC_ARG_ENABLE([docs],
+              [  --disable-docs          disable docs generation (default=no)],,
+              enable_docs="yes")
+
+AM_CONDITIONAL(ENABLE_DOCS, test "x$enable_docs" = "xyes")
+
 ###########################
 # Check target architecture
 ###########################
@@ -206,11 +217,8 @@ esac
 # Check how to find plug-ins
 ############################
 
-AC_MSG_CHECKING([for some Win32 platform])
+AC_MSG_CHECKING([the extension for shared libraries])
 case "$target_or_host" in 
-  *-*-darwin*)                 # darwin
-    shrext=.dylib
-    ;;
   hppa*-hpux*)                # HP/UX
     shrext=.sl
     ;;
@@ -225,6 +233,7 @@ esac
 SHREXT=$shrext
 AC_SUBST(SHREXT)
 AC_DEFINE_UNQUOTED(SHREXT,     "$shrext",     [File extension for shared libraries])
+AC_MSG_RESULT([$shrext])
 
 dnl ===========================================================================
 
@@ -283,9 +292,14 @@ AC_ARG_ENABLE(sse,
   [  --enable-sse            enable SSE support (default=auto)],,
   enable_sse=$enable_mmx)
 
+AC_ARG_ENABLE(sse2,
+  [  --enable-sse2            enable SSE2 support (default=auto)],,
+  enable_sse2=$enable_sse)
+
 if test "x$enable_mmx" = xyes; then
   BABL_DETECT_CFLAGS(MMX_EXTRA_CFLAGS, '-mmmx')
   SSE_EXTRA_CFLAGS=
+  SSE2_EXTRA_CFLAGS=
 
   AC_MSG_CHECKING(whether we can compile MMX code)
 
@@ -298,8 +312,14 @@ if test "x$enable_mmx" = xyes; then
     AC_MSG_RESULT(yes)
 
     if test "x$enable_sse" = xyes; then
+      BABL_DETECT_CFLAGS(fpmath_flag, '-mfpmath=sse')
+      if test "x$platform_win32" = xyes; then
+        BABL_DETECT_CFLAGS(stack_align, '-mstackrealign')
+      fi
+      SSE_EXTRA_CFLAGS="$MMX_EXTRA_CFLAGS $stack_align $fpmath_flag"
+      
       BABL_DETECT_CFLAGS(sse_flag, '-msse')
-      SSE_EXTRA_CFLAGS="$MMX_EXTRA_CFLAGS $sse_flag"
+      SSE_EXTRA_CFLAGS="$SSE_EXTRA_CFLAGS $sse_flag"
 
       AC_MSG_CHECKING(whether we can compile SSE code)
 
@@ -314,6 +334,24 @@ if test "x$enable_mmx" = xyes; then
         AC_MSG_WARN([The assembler does not support the SSE command set.])
       )
 
+      if test "x$enable_sse2" = xyes; then
+        BABL_DETECT_CFLAGS(sse2_flag, '-msse2')
+        SSE2_EXTRA_CFLAGS="$SSE_EXTRA_CFLAGS $sse2_flag"
+
+        AC_MSG_CHECKING(whether we can compile SSE2 code)
+
+        CFLAGS="$CFLAGS $sse2_flag"
+
+        AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[asm ("punpckhwd %xmm0,%xmm1");])],
+          AC_DEFINE(USE_SSE2, 1, [Define to 1 if SSE2 assembly is available.])
+          AC_MSG_RESULT(yes)
+        ,
+          enable_sse2=no
+          AC_MSG_RESULT(no)
+          AC_MSG_WARN([The assembler does not support the SSE2 command set.])
+        )
+      fi
+
     fi
   ,
     enable_mmx=no
@@ -325,6 +363,7 @@ if test "x$enable_mmx" = xyes; then
 
   AC_SUBST(MMX_EXTRA_CFLAGS)
   AC_SUBST(SSE_EXTRA_CFLAGS)
+  AC_SUBST(SSE2_EXTRA_CFLAGS)
 fi
 
 
@@ -386,6 +425,13 @@ if test "x$enable_altivec" = xyes; then
 fi
 
 
+##################
+# Check for random
+##################
+have_srandom=no
+AC_CHECK_FUNC(srandom, have_srandom=yes)
+AM_CONDITIONAL([HAVE_SRANDOM], [test x$have_srandom = xyes])
+
 dnl ===========================================================================
 
 AC_CHECK_HEADERS(dl.h)
@@ -417,6 +463,7 @@ docs/Makefile
 docs/index-static.html
 docs/graphics/Makefile
 tests/Makefile
+tools/Makefile
 extensions/Makefile
 INSTALL
 )
diff --git a/depcomp b/depcomp
index bd0ac089584a762069b7e0b3f2937e89b9144cc7..25a39e6cd5c82d7276f6ccc62ef5e7ba1cc9776f 100755 (executable)
--- a/depcomp
+++ b/depcomp
@@ -1,10 +1,10 @@
 #! /bin/sh
 # depcomp - compile a program generating dependencies as side-effects
 
-scriptversion=2011-12-04.11; # UTC
+scriptversion=2012-03-27.16; # UTC
 
 # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
-# 2011 Free Software Foundation, Inc.
+# 2011, 2012 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@ scriptversion=2011-12-04.11; # UTC
 
 case $1 in
   '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
      exit 1;
      ;;
   -h | --h*)
@@ -40,8 +40,8 @@ as side-effects.
 
 Environment variables:
   depmode     Dependency tracking mode.
-  source      Source file read by `PROGRAMS ARGS'.
-  object      Object file output by `PROGRAMS ARGS'.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
   DEPDIR      directory where to store dependencies.
   depfile     Dependency file to output.
   tmpdepfile  Temporary file to use when outputting dependencies.
@@ -57,6 +57,12 @@ EOF
     ;;
 esac
 
+# A tabulation character.
+tab='  '
+# A newline character.
+nl='
+'
+
 if test -z "$depmode" || test -z "$source" || test -z "$object"; then
   echo "depcomp: Variables source, object and depmode must be set" 1>&2
   exit 1
@@ -102,6 +108,12 @@ if test "$depmode" = msvc7msys; then
    depmode=msvc7
 fi
 
+if test "$depmode" = xlc; then
+   # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations.
+   gccflag=-qmakedep=gcc,-MF
+   depmode=gcc
+fi
+
 case "$depmode" in
 gcc3)
 ## gcc 3 implements dependency tracking that does exactly what
@@ -156,15 +168,14 @@ gcc)
 ## The second -e expression handles DOS-style file names with drive letters.
   sed -e 's/^[^:]*: / /' \
       -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
+## This next piece of magic avoids the "deleted header file" problem.
 ## The problem is that when a header file which appears in a .P file
 ## is deleted, the dependency causes make to die (because there is
 ## typically no way to rebuild the header).  We avoid this by adding
 ## dummy dependencies for each header file.  Too bad gcc doesn't do
 ## this for us directly.
-  tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'.  On the theory
+  tr ' ' "$nl" < "$tmpdepfile" |
+## Some versions of gcc put a space before the ':'.  On the theory
 ## that the space means something, we add a space to the output as
 ## well.  hp depmode also adds that space, but also prefixes the VPATH
 ## to the object.  Take care to not repeat it in the output.
@@ -203,18 +214,15 @@ sgi)
     # clever and replace this with sed code, as IRIX sed won't handle
     # lines with more than a fixed number of characters (4096 in
     # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like `#:fec' to the end of the
+    # the IRIX cc adds comments like '#:fec' to the end of the
     # dependency line.
-    tr ' ' '
-' < "$tmpdepfile" \
+    tr ' ' "$nl" < "$tmpdepfile" \
     | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr '
-' ' ' >> "$depfile"
+    tr "$nl" ' ' >> "$depfile"
     echo >> "$depfile"
 
     # The second pass generates a dummy entry for each header file.
-    tr ' ' '
-' < "$tmpdepfile" \
+    tr ' ' "$nl" < "$tmpdepfile" \
    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
    >> "$depfile"
   else
@@ -226,10 +234,17 @@ sgi)
   rm -f "$tmpdepfile"
   ;;
 
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
 aix)
   # The C for AIX Compiler uses -M and outputs the dependencies
   # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
   # start of each line; $object doesn't have directory information.
   # Version 6 uses the directory in both cases.
   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
@@ -259,12 +274,11 @@ aix)
     test -f "$tmpdepfile" && break
   done
   if test -f "$tmpdepfile"; then
-    # Each line is of the form `foo.o: dependent.h'.
+    # Each line is of the form 'foo.o: dependent.h'.
     # Do two passes, one to just change these to
-    # `$object: dependent.h' and one to simply `dependent.h:'.
+    # '$object: dependent.h' and one to simply 'dependent.h:'.
     sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-    # That's a tab and a space in the [].
-    sed -e 's,^.*\.[a-z]*:[     ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+    sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
   else
     # The sourcefile does not contain any dependencies, so just
     # store a dummy comment line, to avoid errors with the Makefile
@@ -275,23 +289,26 @@ aix)
   ;;
 
 icc)
-  # Intel's C compiler understands `-MD -MF file'.  However on
-  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'.
+  # However on
+  #    $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c
   # ICC 7.0 will fill foo.d with something like
   #    foo.o: sub/foo.c
   #    foo.o: sub/foo.h
-  # which is wrong.  We want:
+  # which is wrong.  We want
   #    sub/foo.o: sub/foo.c
   #    sub/foo.o: sub/foo.h
   #    sub/foo.c:
   #    sub/foo.h:
   # ICC 7.1 will output
   #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using :
+  # and will wrap long lines using '\':
   #    foo.o: sub/foo.c ... \
   #     sub/foo.h ... \
   #     ...
-
+  # tcc 0.9.26 (FIXME still under development at the moment of writing)
+  # will emit a similar output, but also prepend the continuation lines
+  # with horizontal tabulation characters.
   "$@" -MD -MF "$tmpdepfile"
   stat=$?
   if test $stat -eq 0; then :
@@ -300,15 +317,21 @@ icc)
     exit $stat
   fi
   rm -f "$depfile"
-  # Each line is of the form `foo.o: dependent.h',
-  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Each line is of the form 'foo.o: dependent.h',
+  # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'.
   # Do two passes, one to just change these to
-  # `$object: dependent.h' and one to simply `dependent.h:'.
-  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process this invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
-    sed -e 's/$/ :/' >> "$depfile"
+  # '$object: dependent.h' and one to simply 'dependent.h:'.
+  sed -e "s/^[ $tab][ $tab]*/  /" -e "s,^[^:]*:,$object :," \
+    < "$tmpdepfile" > "$depfile"
+  sed '
+    s/[ '"$tab"'][ '"$tab"']*/ /g
+    s/^ *//
+    s/ *\\*$//
+    s/^[^:]*: *//
+    /^$/d
+    /:$/d
+    s/$/ :/
+  ' < "$tmpdepfile" >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
@@ -344,7 +367,7 @@ hp2)
   done
   if test -f "$tmpdepfile"; then
     sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
-    # Add `dependent.h:' lines.
+    # Add 'dependent.h:' lines.
     sed -ne '2,${
               s/^ *//
               s/ \\*$//
@@ -359,9 +382,9 @@ hp2)
 
 tru64)
    # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
    # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in `foo.d' instead, so we check for that too.
+   # dependencies in 'foo.d' instead, so we check for that too.
    # Subdirectories are respected.
    dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
    test "x$dir" = "x$object" && dir=
@@ -407,8 +430,7 @@ tru64)
    done
    if test -f "$tmpdepfile"; then
       sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      # That's a tab and a space in the [].
-      sed -e 's,^.*\.[a-z]*:[   ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+      sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
    else
       echo "#dummy" > "$depfile"
    fi
@@ -443,11 +465,11 @@ msvc7)
   p
 }' | $cygpath_u | sort -u | sed -n '
 s/ /\\ /g
-s/\(.*\)/      \1 \\/p
+s/\(.*\)/'"$tab"'\1 \\/p
 s/.\(.*\) \\/\1:/
 H
 $ {
-  s/.*/        /
+  s/.*/'"$tab"'/
   G
   p
 }' >> "$depfile"
@@ -478,7 +500,7 @@ dashmstdout)
     shift
   fi
 
-  # Remove `-o $object'.
+  # Remove '-o $object'.
   IFS=" "
   for arg
   do
@@ -498,15 +520,14 @@ dashmstdout)
   done
 
   test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for `:'
+  # Require at least two characters before searching for ':'
   # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
   "$@" $dashmflag |
-    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+    sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile"
   rm -f "$depfile"
   cat < "$tmpdepfile" > "$depfile"
-  tr ' ' '
-' < "$tmpdepfile" | \
+  tr ' ' "$nl" < "$tmpdepfile" | \
 ## Some versions of the HPUX 10.20 sed can't process this invocation
 ## correctly.  Breaking it into two sed invocations is a workaround.
     sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
@@ -562,8 +583,7 @@ makedepend)
   # makedepend may prepend the VPATH from the source file name to the object.
   # No need to regex-escape $object, excess matching of '.' is harmless.
   sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
+  sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \
 ## Some versions of the HPUX 10.20 sed can't process this invocation
 ## correctly.  Breaking it into two sed invocations is a workaround.
     sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
@@ -583,7 +603,7 @@ cpp)
     shift
   fi
 
-  # Remove `-o $object'.
+  # Remove '-o $object'.
   IFS=" "
   for arg
   do
@@ -652,8 +672,8 @@ msvisualcpp)
   sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::     \1 \\:p' >> "$depfile"
-  echo "       " >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
   sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
index d12b5b2cabfa4a888747711023aaf557ccdd5c40..dbb817f2cb759f9803d3338ea48b9005ffc7af7f 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 
 @SET_MAKE@
 VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -33,15 +50,15 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
+target_triplet = @target@
 subdir = docs
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
        $(srcdir)/index-static.html.in COPYING COPYING.LESSER
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/introspection.m4 \
-       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
-       $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -63,6 +80,11 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
        install-pdf-recursive install-ps-recursive install-recursive \
        installcheck-recursive installdirs-recursive pdf-recursive \
        ps-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
   distclean-recursive maintainer-clean-recursive
 AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
@@ -142,14 +164,6 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
-INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
-INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
-INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
-INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
-INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
-INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
-INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -179,18 +193,15 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEP = @PATH_SEP@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
 RANLIB = @RANLIB@
 RSVG = @RSVG@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SHREXT = @SHREXT@
+SSE2_EXTRA_CFLAGS = @SSE2_EXTRA_CFLAGS@
 SSE_EXTRA_CFLAGS = @SSE_EXTRA_CFLAGS@
 STRIP = @STRIP@
-VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 W3M = @W3M@
 WEBSITE_HOST = @WEBSITE_HOST@
@@ -243,7 +254,11 @@ sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sysconfdir = @sysconfdir@
+target = @target@
 target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
@@ -484,13 +499,10 @@ distdir: $(DISTFILES)
        done
        @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
          if test "$$subdir" = .; then :; else \
-           test -d "$(distdir)/$$subdir" \
-           || $(MKDIR_P) "$(distdir)/$$subdir" \
-           || exit 1; \
-         fi; \
-       done
-       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
            dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
            $(am__relativize); \
            new_distdir=$$reldir; \
index 746b0cecd036bb5ed324618cd233325655c92f03..f201be61f8524a0de586aa121c8255f548b86c5b 100644 (file)
@@ -22,7 +22,7 @@ MAINTAINERCLEANFILES = $(PNG_FILES)
 all: $(MAINTAINERCLEANFILES)
 
 RSVG_CMD = echo -n " SVG: $@" ;\
-  $(RSVG) $< $@\
+  $(RSVG) -o $@ $< \
     &&\
       echo " [OK]"\
     ||\
@@ -40,7 +40,7 @@ dist-check-rsvg:
 # 0.0
 babl-a4poster.png: babl-a4poster.svg
        echo -n " SVG: $@" ;\
-       $(RSVG) -w 256 $< $@\
+       $(RSVG) -w 256 -o $@ $< \
          &&\
            echo " [OK]"\
          ||\
index cfd47fcf74428254f5540fb7951ef1b6f4c7ce8f..262f3786f3621ad52473b6c2f81178b921089c89 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 
 @SET_MAKE@
 VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -33,14 +50,14 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
+target_triplet = @target@
 subdir = docs/graphics
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/introspection.m4 \
-       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
-       $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -55,6 +72,11 @@ am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
 am__v_at_0 = @
 SOURCES =
 DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ALTIVEC_EXTRA_CFLAGS = @ALTIVEC_EXTRA_CFLAGS@
@@ -102,14 +124,6 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
-INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
-INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
-INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
-INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
-INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
-INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
-INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -139,18 +153,15 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEP = @PATH_SEP@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
 RANLIB = @RANLIB@
 RSVG = @RSVG@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SHREXT = @SHREXT@
+SSE2_EXTRA_CFLAGS = @SSE2_EXTRA_CFLAGS@
 SSE_EXTRA_CFLAGS = @SSE_EXTRA_CFLAGS@
 STRIP = @STRIP@
-VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 W3M = @W3M@
 WEBSITE_HOST = @WEBSITE_HOST@
@@ -203,7 +214,11 @@ sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sysconfdir = @sysconfdir@
+target = @target@
 target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
@@ -224,7 +239,7 @@ EXTRA_DIST = \
 
 MAINTAINERCLEANFILES = $(PNG_FILES)
 RSVG_CMD = echo -n " SVG: $@" ;\
-  $(RSVG) $< $@\
+  $(RSVG) -o $@ $< \
     &&\
       echo " [OK]"\
     ||\
@@ -440,7 +455,7 @@ all: $(MAINTAINERCLEANFILES)
 # 0.0
 @HAVE_RSVG_TRUE@babl-a4poster.png: babl-a4poster.svg
 @HAVE_RSVG_TRUE@       echo -n " SVG: $@" ;\
-@HAVE_RSVG_TRUE@       $(RSVG) -w 256 $< $@\
+@HAVE_RSVG_TRUE@       $(RSVG) -w 256 -o $@ $< \
 @HAVE_RSVG_TRUE@         &&\
 @HAVE_RSVG_TRUE@           echo " [OK]"\
 @HAVE_RSVG_TRUE@         ||\
index 9127121bd88454724810da3076b4c743147894e6..709a9485b5cbcd40e1df81616f0bf561850fc04d 100644 (file)
@@ -7,6 +7,7 @@
 <html>
   <head>
     <title>babl-@BABL_VERSION@</title>
+    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
 
     <link rel="icon" href="graphics/babl-16x16.png" type="image/png" />
     <link rel="shortcut icon" href="graphics/babl-16x16.png" type="image/png" />
         <pre>
 int width = 123, height = 581, pixel_count = width * height;
 
-const Babl *srgb            = <span class='function'>babl_format</span> <span class='paren'>(</span><span class='string'>"R'G'B' u8"</span><span class='paren'>)</span>;
-const Babl *lab             = <span class='function'>babl_format</span> <span class='paren'>(</span><span class='string'>"CIE Lab float"</span><span class='paren'>)</span>;
-Babl       *rgb_to_lab_fish = <span class='function'>babl_fish</span> <span class='paren'>(</span>srgb, lab);
+const Babl *srgb             = <span class='function'>babl_format</span> <span class='paren'>(</span><span class='string'>"R'G'B' u8"</span><span class='paren'>)</span>;
+const Babl *lab              = <span class='function'>babl_format</span> <span class='paren'>(</span><span class='string'>"CIE Lab float"</span><span class='paren'>)</span>;
+const Babl *srgb_to_lab_fish = <span class='function'>babl_fish</span> <span class='paren'>(</span>srgb, lab);
 
 float         *lab_buffer;
 unsigned char *srgb_buffer;
@@ -232,7 +233,7 @@ lab_buffer  = malloc (pixel_count * 3 * sizeof (float));
 
 ...... load data into srgb_buffer .......
 
-<span class='function'>babl_process</span> <span class='paren'>(</span>rgb_to_lab_fish, srgb_buffer, lab_buffer, pixel_count<span class='paren'>);</span>
+<span class='function'>babl_process</span> <span class='paren'>(</span>srgb_to_lab_fish, srgb_buffer, lab_buffer, pixel_count<span class='paren'>);</span>
 
 ...... do operation in lab space ........
 
index 75c121376fe366d293e073e9f853ce1e5dcf3cb5..c3fc35262fa444eb268dafb44ad346955a9d7921 100644 (file)
@@ -1,6 +1,7 @@
 /* babl - dynamically extendable universal pixel conversion library.
- * Copyright (C) 2005, Øyvind Kolås.
+ * Copyright (C) 2005, 2014 Øyvind Kolås.
  * Copyright (C) 2009, Martin Nordholts
+ * Copyright (C) 2014, Elle Stone
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -54,6 +55,9 @@ components (void)
   babl_component_new ("CIE b", "chroma", NULL);
   babl_component_new ("CIE C(ab)", "chroma", NULL);
   babl_component_new ("CIE H(ab)", "chroma", NULL);
+  /* babl_component_new ("CIE X", NULL);
+  babl_component_new ("CIE Y", NULL);
+  babl_component_new ("CIE Z", NULL);*/
 }
 
 static void
@@ -88,69 +92,55 @@ models (void)
     babl_component ("CIE H(ab)"),
     babl_component ("A"),
     NULL);
+  /*babl_model_new (
+    "name", "CIE XYZ",
+    babl_component ("CIE X"),
+    babl_component ("CIE Y"),
+    babl_component ("CIE Z"),
+    NULL);*/
 }
 
-/***********    cpercep.h *********   */
+static void  rgbcie_init (void);
 
-/*
-   Copyright (C) 1997-2002 Adam D. Moss (the "Author").  All Rights Reserved.
-
-   Permission is hereby granted, free of charge, to any person obtaining a copy
-   of this software and associated documentation files (the "Software"), to deal
-   in the Software without restriction, including without limitation the rights
-   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-   copies of the Software, and to permit persons to whom the Software is fur-
-   nished to do so, subject to the following conditions:
-
-   The above copyright notice and this permission notice shall be included in
-   all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
-   NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-   AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-   IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
-   NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-   Except as contained in this notice, the name of the Author of the
-   Software shall not be used in advertising or otherwise to promote the sale,
-   use or other dealings in this Software without prior written authorization
-   from the Author.
- */
-
-/*
-   cpercep.c: The CPercep Functions v0.9: 2002-02-10
-   Adam D. Moss: adam@gimp.org <http://www.foxbox.org/adam/code/cpercep/>
-
-   TODO: document functions, rename erroneously-named arguments
- */
-
-static void  cpercep_init (void);
-
-static void  cpercep_rgb_to_space (double  inr,
-                                   double  ing,
-                                   double  inb,
-                                   double *outr,
-                                   double *outg,
-                                   double *outb);
-
-static void  cpercep_space_to_rgb (double  inr,
-                                   double  ing,
-                                   double  inb,
-                                   double *outr,
-                                   double *outg,
-                                   double *outb);
-
-static void  ab_to_chab           (double  a,
+static inline void  ab_to_CHab    (double  a,
                                    double  b,
-                                   double *C,
-                                   double *H);
+                                   double *to_C,
+                                   double *to_H);
 
-static void  chab_to_ab           (double  C,
+static inline void  CHab_to_ab    (double  C,
                                    double  H,
-                                   double *a,
-                                   double *b);
-
+                                   double *to_a,
+                                   double *to_b);
+                                   
+static inline void RGB_to_XYZ     (double R,
+                                   double G,
+                                   double B,
+                                   double *to_X,
+                                   double *to_Y,
+                                   double *to_Z);
+
+static inline void XYZ_to_LAB     (double X,
+                                   double Y,
+                                   double Z,
+                                   double *to_L,
+                                   double *to_a,
+                                   double *to_b
+                                   );
+
+static inline void LAB_to_XYZ     (double L,
+                                   double a,
+                                   double b,
+                                   double *to_X,
+                                   double *to_Y,
+                                   double *to_Z
+                                   );
+
+static inline void XYZ_to_RGB     (double X,
+                                   double Y,
+                                   double Z,
+                                   double *to_R,
+                                   double *to_G,
+                                   double *to_B);
 
 static long
 rgba_to_lab (char *src,
@@ -159,13 +149,16 @@ rgba_to_lab (char *src,
 {
   while (n--)
     {
-      double red   = ((double *) src)[0];
-      double green = ((double *) src)[1];
-      double blue  = ((double *) src)[2];
-
-      double L, a, b;
-
-      cpercep_rgb_to_space (red, green, blue, &L, &a, &b);
+      double R  = ((double *) src)[0];
+      double G  = ((double *) src)[1];
+      double B  = ((double *) src)[2];
+      double X, Y, Z, L, a, b;
+      
+      //convert RGB to XYZ
+      RGB_to_XYZ (R, G, B, &X, &Y, &Z);
+      
+      //convert XYZ to Lab
+      XYZ_to_LAB (X, Y, Z, &L, &a, &b);
 
       ((double *) dst)[0] = L;
       ((double *) dst)[1] = a;
@@ -188,13 +181,16 @@ lab_to_rgba (char *src,
       double a = ((double *) src)[1];
       double b = ((double *) src)[2];
 
-      double red, green, blue;
-
-      cpercep_space_to_rgb (L, a, b, &red, &green, &blue);
-
-      ((double *) dst)[0] = red;
-      ((double *) dst)[1] = green;
-      ((double *) dst)[2] = blue;
+      double X, Y, Z, R, G, B;
+      
+      //convert Lab to XYZ
+      LAB_to_XYZ (L, a, b, &X, &Y, &Z);
+      
+      //convert XYZ to RGB
+      XYZ_to_RGB (X, Y, Z, &R, &G, &B);
+      ((double *) dst)[0] = R;
+      ((double *) dst)[1] = G;
+      ((double *) dst)[2] = B;
       ((double *) dst)[3] = 1.0;
 
       src += sizeof (double) * 3;
@@ -211,14 +207,17 @@ rgba_to_laba (char *src,
 {
   while (n--)
     {
-      double red   = ((double *) src)[0];
-      double green = ((double *) src)[1];
-      double blue  = ((double *) src)[2];
+      double R     = ((double *) src)[0];
+      double G     = ((double *) src)[1];
+      double B     = ((double *) src)[2];
       double alpha = ((double *) src)[3];
-
-      double L, a, b;
-
-      cpercep_rgb_to_space (red, green, blue, &L, &a, &b);
+      double X, Y, Z, L, a, b;
+      
+      //convert RGB to XYZ
+      RGB_to_XYZ (R, G, B, &X, &Y, &Z);
+      
+      //convert XYZ to Lab
+      XYZ_to_LAB (X, Y, Z, &L, &a, &b);
 
       ((double *) dst)[0] = L;
       ((double *) dst)[1] = a;
@@ -243,13 +242,16 @@ laba_to_rgba (char *src,
       double b     = ((double *) src)[2];
       double alpha = ((double *) src)[3];
 
-      double red, green, blue;
-
-      cpercep_space_to_rgb (L, a, b, &red, &green, &blue);
-
-      ((double *) dst)[0] = red;
-      ((double *) dst)[1] = green;
-      ((double *) dst)[2] = blue;
+      double X, Y, Z, R, G, B;
+      
+      //convert Lab to XYZ
+      LAB_to_XYZ (L, a, b, &X, &Y, &Z);
+      
+      //convert XYZ to RGB
+      XYZ_to_RGB (X, Y, Z, &R, &G, &B);
+      ((double *) dst)[0] = R;
+      ((double *) dst)[1] = G;
+      ((double *) dst)[2] = B;
       ((double *) dst)[3] = alpha;
 
       src += sizeof (double) * 4;
@@ -258,8 +260,30 @@ laba_to_rgba (char *src,
   return n;
 }
 
+static inline void
+CHab_to_ab (double  C,
+            double  H,
+            double *to_a,
+            double *to_b)
+{
+  *to_a = cos (H * RADIANS_PER_DEGREE) * C;
+  *to_b = sin (H * RADIANS_PER_DEGREE) * C;
+}
 
+static inline void
+ab_to_CHab (double  a,
+            double  b,
+            double *to_C,
+            double *to_H)
+{
+  *to_C = sqrt ( (a * a) + (b * b) );
+  *to_H = atan2 (b, a) * DEGREES_PER_RADIAN;
 
+  // Keep H within the range 0-360
+  if (*to_H < 0.0)
+    *to_H += 360;
+
+}
 
 static long
 rgba_to_lchab (char *src,
@@ -268,13 +292,19 @@ rgba_to_lchab (char *src,
 {
   while (n--)
     {
-      double red   = ((double *) src)[0];
-      double green = ((double *) src)[1];
-      double blue  = ((double *) src)[2];
-      double L, a, b, C, H;
-
-      cpercep_rgb_to_space (red, green, blue, &L, &a, &b);
-      ab_to_chab (a, b, &C, &H);
+      double R = ((double *) src)[0];
+      double G = ((double *) src)[1];
+      double B = ((double *) src)[2];
+      double X, Y, Z, L, a, b, C, H;
+
+      //convert RGB to XYZ
+      RGB_to_XYZ (R, G, B, &X, &Y, &Z);
+      
+      //convert XYZ to Lab
+      XYZ_to_LAB (X, Y, Z, &L, &a, &b);
+      
+      //convert Lab to LCH(ab)
+      ab_to_CHab (a, b, &C, &H);
 
       ((double *) dst)[0] = L;
       ((double *) dst)[1] = C;
@@ -296,14 +326,20 @@ lchab_to_rgba (char *src,
       double L = ((double *) src)[0];
       double C = ((double *) src)[1];
       double H = ((double *) src)[2];
-      double a, b, red, green, blue;
-
-      chab_to_ab (C, H, &a, &b);
-      cpercep_space_to_rgb (L, a, b, &red, &green, &blue);
-
-      ((double *) dst)[0] = red;
-      ((double *) dst)[1] = green;
-      ((double *) dst)[2] = blue;
+      double a, b, X, Y, Z, R, G, B;
+      
+      //Convert LCH(ab) to Lab
+      CHab_to_ab (C, H, &a, &b);
+      
+      //Convert LAB to XYZ
+      LAB_to_XYZ (L, a, b, &X, &Y, &Z);
+      
+      //Convert XYZ to RGB
+      XYZ_to_RGB (X, Y, Z, &R, &G, &B);
+
+      ((double *) dst)[0] = R;
+      ((double *) dst)[1] = G;
+      ((double *) dst)[2] = B;
       ((double *) dst)[3] = 1.0;
 
       src += sizeof (double) * 3;
@@ -320,14 +356,20 @@ rgba_to_lchaba (char *src,
 {
   while (n--)
     {
-      double red   = ((double *) src)[0];
-      double green = ((double *) src)[1];
-      double blue  = ((double *) src)[2];
+      double R = ((double *) src)[0];
+      double G = ((double *) src)[1];
+      double B = ((double *) src)[2];
       double alpha = ((double *) src)[3];
-      double L, a, b, C, H;
+      double X, Y, Z, L, a, b, C, H;
 
-      cpercep_rgb_to_space (red, green, blue, &L, &a, &b);
-      ab_to_chab (a, b, &C, &H);
+      //convert RGB to XYZ
+      RGB_to_XYZ (R, G, B, &X, &Y, &Z);
+      
+      //convert XYZ to Lab
+      XYZ_to_LAB (X, Y, Z, &L, &a, &b);
+      
+      //convert Lab to LCH(ab)
+      ab_to_CHab (a, b, &C, &H);
 
       ((double *) dst)[0] = L;
       ((double *) dst)[1] = C;
@@ -351,14 +393,20 @@ lchaba_to_rgba (char *src,
       double C     = ((double *) src)[1];
       double H     = ((double *) src)[2];
       double alpha = ((double *) src)[3];
-      double a, b, red, green, blue;
-
-      chab_to_ab (C, H, &a, &b);
-      cpercep_space_to_rgb (L, a, b, &red, &green, &blue);
-
-      ((double *) dst)[0] = red;
-      ((double *) dst)[1] = green;
-      ((double *) dst)[2] = blue;
+      double a, b, X, Y, Z, R, G, B;
+      
+      //Convert LCH(ab) to Lab
+      CHab_to_ab (C, H, &a, &b);
+      
+      //Convert Lab to XYZ
+      LAB_to_XYZ (L, a, b, &X, &Y, &Z);
+      
+      //Convert XYZ to RGB
+      XYZ_to_RGB (X, Y, Z, &R, &G, &B);
+      
+      ((double *) dst)[0] = R;
+      ((double *) dst)[1] = G;
+      ((double *) dst)[2] = B;
       ((double *) dst)[3] = alpha;
 
       src += sizeof (double) * 4;
@@ -419,8 +467,20 @@ conversions (void)
     "linear", lchaba_to_rgba,
     NULL
   );
+  /*babl_conversion_new (
+    babl_model ("RGBA"),
+    babl_model ("CIE XYZ"),
+    "linear", RGB_to_XYZ,
+    NULL
+  );
+  babl_conversion_new (
+    babl_model ("CIE XYZ"),
+    babl_model ("RGBA"),
+    "linear", XYZ_to_RGB,
+    NULL
+  );*/
 
-  cpercep_init ();
+  rgbcie_init ();
 }
 
 static void
@@ -435,6 +495,16 @@ formats (void)
     babl_component ("CIE a"),
     babl_component ("CIE b"),
     NULL);
+    
+  /*babl_format_new (
+    "name", "CIE XYZ float",
+    babl_model ("CIE XYZ"),
+
+    babl_type ("float"),
+    babl_component ("CIE X"),
+    babl_component ("CIE Y"),
+    babl_component ("CIE Z"),
+    NULL);*/
 
   babl_format_new (
     "name", "CIE Lab alpha float",
@@ -556,13 +626,13 @@ convert_u8_double_scaled (double        min_val,
   return n;
 }
 
-#define MAKE_CONVERSIONS(name, min_val, max_val, min, max)      \
+#define MAKE_CONVERSIONS(name, min_val, max_val, min, max) \
   static long \
   convert_ ## name ## _double (char *src, \
                                char *dst, \
                                int src_pitch, \
                                int dst_pitch, \
-                               long n)                               \
+                               long n)        \
   { \
     return convert_u8_double_scaled (min_val, max_val, min, max, \
                                      src, dst, src_pitch, dst_pitch, n); \
@@ -572,7 +642,7 @@ convert_u8_double_scaled (double        min_val,
                            char *dst, \
                            int src_pitch, \
                            int dst_pitch, \
-                           long n)                                 \
+                           long n)        \
   { \
     return convert_double_u8_scaled (min_val, max_val, min, max, \
                                      src, dst, src_pitch, dst_pitch, n); \
@@ -603,8 +673,8 @@ types_u8 (void)
     "integer",
     "unsigned",
     "bits", 8,
-    "min_val", -50.0,
-    "max_val", 50.0,
+    "min_val", -128.0,
+    "max_val", 127.0,
     NULL
   );
 
@@ -701,7 +771,7 @@ convert_u16_double_scaled (double         min_val,
                                char *dst, \
                                int src_pitch, \
                                int dst_pitch, \
-                               long n)                               \
+                               long n)        \
   { \
     return convert_u16_double_scaled (min_val, max_val, min, max, \
                                       src, dst, src_pitch, dst_pitch, n); \
@@ -711,7 +781,7 @@ convert_u16_double_scaled (double         min_val,
                            char *dst, \
                            int src_pitch, \
                            int dst_pitch, \
-                           long n)                                 \
+                           long n)        \
   { \
     return convert_double_u16_scaled (min_val, max_val, min, max, \
                                       src, dst, src_pitch, dst_pitch, n); \
@@ -741,8 +811,8 @@ types_u16 (void)
     "integer",
     "unsigned",
     "bits", 16,
-    "min_val", -50.0,
-    "max_val", 50.0,
+    "min_val", -128.0,
+    "max_val", 127.0,
     NULL
   );
 
@@ -782,591 +852,197 @@ types (void)
 }
 
 
-
-
-/***********   cpercep.c *********   */
-
-
-/*
-   Copyright (C) 1999-2002 Adam D. Moss (the "Author").  All Rights Reserved.
-
-   Permission is hereby granted, free of charge, to any person obtaining a copy
-   of this software and associated documentation files (the "Software"), to deal
-   in the Software without restriction, including without limitation the rights
-   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-   copies of the Software, and to permit persons to whom the Software is fur-
-   nished to do so, subject to the following conditions:
-
-   The above copyright notice and this permission notice shall be included in
-   all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
-   NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-   AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-   IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
-   NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-   Except as contained in this notice, the name of the Author of the
-   Software shall not be used in advertising or otherwise to promote the sale,
-   use or other dealings in this Software without prior written authorization
-   from the Author.
- */
-
-/*
-   cpercep.c: The CPercep Functions v0.9: 2002-02-10
-   Adam D. Moss: adam@gimp.org <http://www.foxbox.org/adam/code/cpercep/>
-
-   This code module concerns itself with conversion from a hard-coded
-   RGB colour space (sRGB by default) to CIE L*a*b* and back again with
-   (primarily) precision and (secondarily) speed, oriented largely
-   towards the purposes of quantifying the PERCEPTUAL difference between
-   two arbitrary RGB colours with a minimum of fuss.
-
-   Motivation One: The author is disheartened at the amount of graphics
-   processing software around which uses weighted or non-weighted
-   Euclidean distance between co-ordinates within a (poorly-defined) RGB
-   space as the basis of what should really be an estimate of perceptual
-   difference to the human eye.  Certainly it's fast to do it that way,
-   but please think carefully about whether your particular application
-   should be tolerating sloppy results for the sake of real-time response.
-
-   Motivation Two: Lack of tested, re-usable and free code available
-   for this purpose.  The difficulty in finding something similar to
-   CPercep with a free license motivated this project; I hope that this
-   code also serves to illustrate how to perform the
-   R'G'B'->XYZ->L*a*b*->XYZ->R'G'B' transformation correctly since I
-   was distressed to note how many of the equations and code snippets
-   on the net were omitting the reverse transform and/or were using
-   incorrectly-derived or just plain wrong constants.
-
-   TODO: document functions, rename erroneously-named arguments
- */
-
-/* defines added to make it compile outside gimp */
-
-#ifndef gboolean
-#define gboolean    int
-#endif
-#ifndef FALSE
-#define FALSE       0
-#endif
-#ifndef TRUE
-#define TRUE        1
-#endif
-
-
-/* #include "config.h" */
-#include <math.h>
-
-#ifndef __GLIBC__
-/* cbrt() is a GNU extension */
-#define cbrt(x)    (pow (x, 1.0 / 3.0))
-#endif
-
-
-/* defines:
-
-   SANITY: emits warnings when passed non-sane colours (and usually
-   corrects them) -- useful when debugging.
-
-   APPROX: speeds up the conversion from RGB to the colourspace by
-   assuming that the RGB values passed in are integral and definitely
-   in the range 0->255
- */
-
-/* #define SANITY */
-/* #define APPROX */
-
-
-/* define characteristics of the source RGB space (and the space
-   within which we try to behave linearly). */
-
-/* Phosphor colours: */
-
-/* sRGB/HDTV phosphor colours */
-static const double pxr = 0.64F;
-static const double pyr = 0.33F;
-static const double pxg = 0.30F;
-static const double pyg = 0.60F;
-static const double pxb = 0.15F;
-static const double pyb = 0.06F;
-
-/* White point: */
-
-/* D65 (6500K) (recommended but not a common display default) */
-static const double lxn = 0.312713F;
-static const double lyn = 0.329016F;
-
-/* D50 (5000K) */
-/*static const double lxn = 0.3457F; */
-/*static const double lyn = 0.3585F; */
-
-/* D55 (5500K) */
-/*static const double lxn = 0.3324F; */
-/*static const double lyn = 0.3474F; */
-
-/* D93 (9300K) (a common monitor default, but poor colour reproduction) */
-/* static const double lxn = 0.2848F; */
-/* static const double lyn = 0.2932F; */
-
-/* illum E (normalized) */
-/*static const double lxn = 1.0/3.0F; */
-/*static const double lyn = 1.0/3.0F; */
-
-/* illum C (average sunlight) */
-/*static const double lxn = 0.3101F; */
-/*static const double lyn = 0.3162F; */
-
-/* illum B (direct sunlight) */
-/*static const double lxn = 0.3484F; */
-/*static const double lyn = 0.3516F; */
-
-/* illum A (tungsten lamp) */
-/*static const double lxn = 0.4476F; */
-/*static const double lyn = 0.4074F; */
-
-
-static const double LRAMP = 7.99959199F;
-
-
-static double xnn, znn;
-
-
-#ifndef CLAMP
-#define CLAMP(x, l, u)    ((x) < (l) ? (l) : ((x) > (u) ? (u) : (x)))
-#endif
-
-
-typedef double CMatrix[3][3];
-typedef double CVector[3];
-
-static CMatrix Mrgb_to_xyz, Mxyz_to_rgb;
-
-static int
-Minvert (CMatrix src, CMatrix dest)
-{
-  double det;
-
-  dest[0][0] = src[1][1] * src[2][2] - src[1][2] * src[2][1];
-  dest[0][1] = src[0][2] * src[2][1] - src[0][1] * src[2][2];
-  dest[0][2] = src[0][1] * src[1][2] - src[0][2] * src[1][1];
-  dest[1][0] = src[1][2] * src[2][0] - src[1][0] * src[2][2];
-  dest[1][1] = src[0][0] * src[2][2] - src[0][2] * src[2][0];
-  dest[1][2] = src[0][2] * src[1][0] - src[0][0] * src[1][2];
-  dest[2][0] = src[1][0] * src[2][1] - src[1][1] * src[2][0];
-  dest[2][1] = src[0][1] * src[2][0] - src[0][0] * src[2][1];
-  dest[2][2] = src[0][0] * src[1][1] - src[0][1] * src[1][0];
-
-  det =
-    src[0][0] * dest[0][0] +
-    src[0][1] * dest[1][0] +
-    src[0][2] * dest[2][0];
-
-  if (det <= 0.0F)
-    {
-#ifdef SANITY
-      g_printerr ("\n\007 XXXX det: %f\n", det);
-#endif
-      return 0;
-    }
-
-  dest[0][0] /= det;
-  dest[0][1] /= det;
-  dest[0][2] /= det;
-  dest[1][0] /= det;
-  dest[1][1] /= det;
-  dest[1][2] /= det;
-  dest[2][0] /= det;
-  dest[2][1] /= det;
-  dest[2][2] /= det;
-
-  return 1;
-}
-
-
 static void
 rgbxyzrgb_init (void)
 {
-  /* The gamma related code has been removed since we do our
-   * calculations in linear light. To revice that code, use version
-   * control means
-   */
-
-  xnn = lxn / lyn;
-  /* ynn taken as 1.0 */
-  znn = (1.0F - (lxn + lyn)) / lyn;
-
-  {
-    CMatrix MRC, MRCi;
-    double  C1, C2, C3;
-
-    MRC[0][0] = pxr;
-    MRC[0][1] = pxg;
-    MRC[0][2] = pxb;
-    MRC[1][0] = pyr;
-    MRC[1][1] = pyg;
-    MRC[1][2] = pyb;
-    MRC[2][0] = 1.0F - (pxr + pyr);
-    MRC[2][1] = 1.0F - (pxg + pyg);
-    MRC[2][2] = 1.0F - (pxb + pyb);
-
-    Minvert (MRC, MRCi);
-
-    C1 = MRCi[0][0] * xnn + MRCi[0][1] + MRCi[0][2] * znn;
-    C2 = MRCi[1][0] * xnn + MRCi[1][1] + MRCi[1][2] * znn;
-    C3 = MRCi[2][0] * xnn + MRCi[2][1] + MRCi[2][2] * znn;
-
-    Mrgb_to_xyz[0][0] = MRC[0][0] * C1;
-    Mrgb_to_xyz[0][1] = MRC[0][1] * C2;
-    Mrgb_to_xyz[0][2] = MRC[0][2] * C3;
-    Mrgb_to_xyz[1][0] = MRC[1][0] * C1;
-    Mrgb_to_xyz[1][1] = MRC[1][1] * C2;
-    Mrgb_to_xyz[1][2] = MRC[1][2] * C3;
-    Mrgb_to_xyz[2][0] = MRC[2][0] * C1;
-    Mrgb_to_xyz[2][1] = MRC[2][1] * C2;
-    Mrgb_to_xyz[2][2] = MRC[2][2] * C3;
-
-    Minvert (Mrgb_to_xyz, Mxyz_to_rgb);
-  }
 }
 
-
-static void
-xyz_to_rgb (double *inx_outr,
-            double *iny_outg,
-            double *inz_outb)
+static inline void
+RGB_to_XYZ (double R,
+            double G,
+            double B,
+            double *to_X,
+            double *to_Y,
+            double *to_Z)
 {
-  const double x = *inx_outr;
-  const double y = *iny_outg;
-  const double z = *inz_outb;
-
-  *inx_outr = Mxyz_to_rgb[0][0] * x + Mxyz_to_rgb[0][1] * y + Mxyz_to_rgb[0][2] * z;
-  *iny_outg = Mxyz_to_rgb[1][0] * x + Mxyz_to_rgb[1][1] * y + Mxyz_to_rgb[1][2] * z;
-  *inz_outb = Mxyz_to_rgb[2][0] * x + Mxyz_to_rgb[2][1] * y + Mxyz_to_rgb[2][2] * z;
-}
-
+  double RGBtoXYZ[3][3];
 
-static void
-rgb_to_xyz (double *inr_outx,
-            double *ing_outy,
-            double *inb_outz)
-{
-  const double r = *inr_outx;
-  const double g = *ing_outy;
-  const double b = *inb_outz;
+/*
+ * The variables below hard-code the D50-adapted sRGB RGB to XYZ matrix.
+ *
+ * In a properly ICC profile color-managed application, this matrix
+ * is retrieved from the image's ICC profile's RGB colorants.
+ *
+ * */
+  RGBtoXYZ[0][0]= 0.43603516;
+  RGBtoXYZ[0][1]= 0.38511658;
+  RGBtoXYZ[0][2]= 0.14305115;
+  RGBtoXYZ[1][0]= 0.22248840;
+  RGBtoXYZ[1][1]= 0.71690369;
+  RGBtoXYZ[1][2]= 0.06060791;
+  RGBtoXYZ[2][0]= 0.01391602;
+  RGBtoXYZ[2][1]= 0.09706116;
+  RGBtoXYZ[2][2]= 0.71392822;
+
+/* Convert RGB to XYZ */
+  *to_X = RGBtoXYZ[0][0]*R + RGBtoXYZ[0][1]*G + RGBtoXYZ[0][2]*B;
+  *to_Y = RGBtoXYZ[1][0]*R + RGBtoXYZ[1][1]*G + RGBtoXYZ[1][2]*B;
+  *to_Z = RGBtoXYZ[2][0]*R + RGBtoXYZ[2][1]*G + RGBtoXYZ[2][2]*B;
 
-  *inr_outx = Mrgb_to_xyz[0][0] * r + Mrgb_to_xyz[0][1] * g + Mrgb_to_xyz[0][2] * b;
-  *ing_outy = Mrgb_to_xyz[1][0] * r + Mrgb_to_xyz[1][1] * g + Mrgb_to_xyz[1][2] * b;
-  *inb_outz = Mrgb_to_xyz[2][0] * r + Mrgb_to_xyz[2][1] * g + Mrgb_to_xyz[2][2] * b;
 }
 
-
-static inline double
-ffunc (const double t)
+static inline void
+XYZ_to_RGB (double X,
+            double Y,
+            double Z,
+            double *to_R,
+            double *to_G,
+            double *to_B)
 {
-  if (t > 0.008856F)
-    {
-      return (cbrt (t));
-    }
-  else
-    {
-      return (7.787F * t + 16.0F / 116.0F);
-    }
-}
-
+  double XYZtoRGB[3][3];
 
-static inline double
-ffunc_inv (const double t)
-{
-  if (t > 0.206893F)
-    {
-      return (t * t * t);
-    }
-  else
-    {
-      return ((t - 16.0F / 116.0F) / 7.787F);
-    }
+/*
+ * The variables below hard-code the inverse of
+ * the D50-adapted sRGB RGB to XYZ matrix.
+ *
+ * In a properly ICC profile color-managed application,
+ * this matrix is the inverse of the matrix
+ * retrieved from the image's ICC profile's RGB colorants.
+ *
+ */
+  XYZtoRGB[0][0]=  3.134274799724;
+  XYZtoRGB[0][1]= -1.617275708956;
+  XYZtoRGB[0][2]= -0.490724283042;
+  XYZtoRGB[1][0]= -0.978795575994;
+  XYZtoRGB[1][1]=  1.916161689117;
+  XYZtoRGB[1][2]=  0.033453331711;
+  XYZtoRGB[2][0]=  0.071976988401;
+  XYZtoRGB[2][1]= -0.228984974402;
+  XYZtoRGB[2][2]=  1.405718224383;
+
+/* Convert XYZ to RGB */
+  *to_R = XYZtoRGB[0][0] * X + XYZtoRGB[0][1] * Y + XYZtoRGB[0][2] * Z;
+  *to_G = XYZtoRGB[1][0] * X + XYZtoRGB[1][1] * Y + XYZtoRGB[1][2] * Z;
+  *to_B = XYZtoRGB[2][0] * X + XYZtoRGB[2][1] * Y + XYZtoRGB[2][2] * Z;
 }
 
-
-static void
-xyz_to_lab (double *inx,
-            double *iny,
-            double *inz)
+static inline void
+XYZ_to_LAB (double X,
+            double Y,
+            double Z,
+            double *to_L,
+            double *to_a,
+            double *to_b)
 {
-  double       L, a, b;
-  double       ffuncY;
-  const double X = *inx;
-  const double Y = *iny;
-  const double Z = *inz;
-
-  if (Y > 0.0F)
-    {
-      if (Y > 0.008856F)
-        {
-          L = (116.0F * cbrt (Y)) - 16.0F;
-        }
-      else
-        {
-          L = (Y * 903.3F);
-        }
-
-#ifdef SANITY
-      if (L < 0.0F)
-        {
-          g_printerr (" <eek1>%f \007", (float) L);
-        }
-
-      if (L > 100.0F)
-        {
-          g_printerr (" <eek2>%f \007", (float) L);
-        }
-#endif
-    }
-  else
-    {
-      L = 0.0;
-    }
-
-  ffuncY = ffunc (Y);
-  a      = 500.0F * (ffunc (X / xnn) - ffuncY);
-  b      = 200.0F * (ffuncY - ffunc (Z / znn));
 
-  *inx = L;
-  *iny = a;
-  *inz = b;
+  const double kappa   = 903.3;//24389.0/27.0;
+  const double epsilon = 0.008856;//216/24389.0;
+  
+/* The constants below hard-code the D50-adapted sRGB ICC profile 
+ * reference white, aka the ICC profile D50 illuminant. 
+ * 
+ * In a properly ICC profile color-managed application, the profile 
+ * illuminant values should be retrieved from the image's
+ * ICC profile's illuminant.
+ * 
+ * At present, the ICC profile illuminant is always D50. This might
+ * change when the next version of the ICC specs is released.
+ * 
+ * As encoded in an actual V2 or V4 ICC profile, 
+ * the illuminant values are hexadecimal-rounded, as are the following 
+ * hard-coded D50 ICC profile illuminant values:
+ * 
+ * */  
+  const double X_reference_white = 0.964202880;
+  const double Y_reference_white = 1.000000000;
+  const double Z_reference_white = 0.824905400;
+  double x_r = X/X_reference_white;
+  double y_r = Y/Y_reference_white;
+  double z_r = Z/Z_reference_white;
+  
+  double f_x, f_y, f_z;
+  
+  if (x_r > epsilon) f_x = pow(x_r, 1.0 / 3.0);
+  else ( f_x = ((kappa * x_r) + 16) / 116.0 );
+  
+  if (y_r > epsilon) f_y = pow(y_r, 1.0 / 3.0);
+  else ( f_y = ((kappa * y_r) + 16) / 116.0 );
+  
+  if (z_r > epsilon) f_z = pow(z_r, 1.0 / 3.0);
+  else ( f_z = ((kappa * z_r) + 16) / 116.0 );
+
+
+  *to_L = (116.0 * f_y) - 16.0;
+  *to_a = 500.0 * (f_x - f_y);
+  *to_b = 200.0 * (f_y - f_z);
 }
 
-
-static void
-lab_to_xyz (double *inl,
-            double *ina,
-            double *inb)
+static inline void
+LAB_to_XYZ (double L,
+            double a,
+            double b,
+            double *to_X,
+            double *to_Y,
+            double *to_Z)
 {
-  double       X, Y, Z;
-  double       P;
-  const double L = *inl;
-  const double a = *ina;
-  const double b = *inb;
-
-  if (L > LRAMP)
-    {
-      P = Y = (L + 16.0F) / 116.0F;
-      Y = Y * Y * Y;
-    }
-  else
-    {
-      Y = L / 903.3F;
-      P = 7.787F * Y + 16.0F / 116.0F;
-    }
-
-  X = (P + a / 500.0F);
-  X = xnn *ffunc_inv (X);
-  Z = (P - b / 200.0F);
-  Z = znn *ffunc_inv (Z);
-
-#ifdef SANITY
-  if (X < -0.00000F)
-    {
-      if (X < -0.0001F)
-        g_printerr ("{badX %f {%f,%f,%f}}", X, L, a, b);
-      X = 0.0F;
-    }
-  if (Y < -0.00000F)
-    {
-      if (Y < -0.0001F)
-        g_printerr ("{badY %f}", Y);
-      Y = 0.0F;
-    }
-  if (Z < -0.00000F)
-    {
-      if (Z < -0.1F)
-        g_printerr ("{badZ %f}", Z);
-      Z = 0.0F;
-    }
-#endif
 
-  *inl = X;
-  *ina = Y;
-  *inb = Z;
+  const double kappa   = 903.3;//24389.0/27.0;
+  const double epsilon = 0.008856;//216/24389.0;
+  
+  double fy, fx, fz, fx_cubed, fy_cubed, fz_cubed;
+  double xr, yr, zr;
+  
+/* The constants below hard-code the D50-adapted sRGB ICC profile 
+ * reference white, aka the ICC profile D50 illuminant. 
+ * 
+ * In a properly ICC profile color-managed application, the profile 
+ * illuminant values should be retrieved from the image's
+ * ICC profile's illuminant.
+ * 
+ * At present, the ICC profile illuminant is always D50. This might
+ * change when the next version of the ICC specs is released.
+ * 
+ * As encoded in an actual V2 or V4 ICC profile, 
+ * the illuminant values are hexadecimal-rounded, as are the following 
+ * hard-coded D50 ICC profile illuminant values:
+ * 
+ */
+  const double X_reference_white = 0.964202880;
+  const double Y_reference_white = 1.000000000;
+  const double Z_reference_white = 0.824905400;
+  
+  fy = (L + 16.0) / 116.0;
+  fy_cubed = fy*fy*fy;
+  
+  fz = fy - (b / 200.0);
+  fz_cubed = fz*fz*fz;
+  
+  fx = (a / 500.0) + fy;
+  fx_cubed = fx*fx*fx;
+  
+  if (fx_cubed > epsilon) xr = fx_cubed;
+  else xr = ((116.0 * fx) - 16) / kappa;
+
+  if ( L > (kappa * epsilon) ) yr = fy_cubed;
+  else yr = (L / kappa);
+
+  if (fz_cubed > epsilon) zr = fz_cubed;
+  else zr = ( (116.0 * fz) - 16 ) / kappa;
+  
+  *to_X = xr * X_reference_white;
+  *to_Y = yr * Y_reference_white;
+  *to_Z = zr * Z_reference_white;
 }
 
-
-
-/* call this before using the CPercep function */
 static void
-cpercep_init (void)
+rgbcie_init (void)
 {
-  static gboolean initialized = FALSE;
+  static int initialized = 0;
 
   if (!initialized)
     {
       rgbxyzrgb_init ();
-      initialized = TRUE;
+      initialized = 1;
     }
 }
-
-static void
-cpercep_rgb_to_space (double  inr,
-                      double  ing,
-                      double  inb,
-                      double *outr,
-                      double *outg,
-                      double *outb)
-{
-#ifdef APPROX
-#ifdef SANITY
-  /* ADM extra sanity */
-  if ((inr) > 255.0F ||
-      (ing) > 255.0F ||
-      (inb) > 255.0F ||
-      (inr) < -0.0F ||
-      (ing) < -0.0F ||
-      (inb) < -0.0F
-  )
-    abort ();
-#endif /* SANITY */
-#endif /* APPROX */
-
-#ifdef SANITY
-  /* ADM extra sanity */
-  if ((inr) > 1.0F ||
-      (ing) > 1.0F ||
-      (inb) > 1.0F ||
-      (inr) < 0.0F ||
-      (ing) < 0.0F ||
-      (inb) < 0.0F
-  )
-    {
-      g_printerr ("%%");
-      /* abort(); */
-    }
-#endif /* SANITY */
-
-  rgb_to_xyz (&inr, &ing, &inb);
-
-#ifdef SANITY
-  if (inr < 0.0F || ing < 0.0F || inb < 0.0F)
-    {
-      g_printerr (" [BAD2 XYZ: %f,%f,%f]\007 ",
-                  inr, ing, inb);
-    }
-#endif /* SANITY */
-
-  xyz_to_lab (&inr, &ing, &inb);
-
-  *outr = inr;
-  *outg = ing;
-  *outb = inb;
-}
-
-
-static void
-cpercep_space_to_rgb (double  inr,
-                      double  ing,
-                      double  inb,
-                      double *outr,
-                      double *outg,
-                      double *outb)
-{
-  lab_to_xyz (&inr, &ing, &inb);
-
-#ifdef SANITY
-  if (inr < -0.0F || ing < -0.0F || inb < -0.0F)
-    {
-      g_printerr (" [BAD1 XYZ: %f,%f,%f]\007 ",
-                  inr, ing, inb);
-    }
-#endif
-
-  xyz_to_rgb (&inr, &ing, &inb);
-
-  /* yes, essential.  :( */
-  inr = CLAMP (inr, 0.0F, 1.0F);
-  ing = CLAMP (ing, 0.0F, 1.0F);
-  inb = CLAMP (inb, 0.0F, 1.0F);
-
-  *outr = inr;
-  *outg = ing;
-  *outb = inb;
-}
-
-static void
-ab_to_chab (double  a,
-            double  b,
-            double *C,
-            double *H)
-{
-  *C = sqrt (a * a + b * b);
-  *H = atan2 (b, a) * DEGREES_PER_RADIAN;
-
-  /* Keep H within the range 0-360 */
-  if (*H < 0.0)
-    *H += 360;
-}
-
-static void
-chab_to_ab (double  C,
-            double  H,
-            double *a,
-            double *b)
-{
-  *a = cos (H * RADIANS_PER_DEGREE) * C;
-  *b = sin (H * RADIANS_PER_DEGREE) * C;
-}
-
-
-#if 0
-/* EXPERIMENTAL SECTION */
-
-const double
-xscaler (const double start, const double end,
-         const double me, const double him)
-{
-  return start + ((end - start) * him) / (me + him);
-}
-
-
-void
-mix_colours (const double L1, const double a1, const double b1,
-             const double L2, const double a2, const double b2,
-             double *rtnL, double *rtna, double *rtnb,
-             double mass1, double mass2)
-{
-  double w1, w2;
-
-#if 0
-  *rtnL = xscaler (L1, L2, mass1, mass2);
-  *rtna = xscaler (a1, a2, mass1, mass2);
-  *rtnb = xscaler (b1, b2, mass1, mass2);
-#else
-#if 1
-  w1 = mass1 * L1;
-  w2 = mass2 * L2;
-#else
-  w1 = mass1 * (L1 * L1 * L1);
-  w2 = mass2 * (L2 * L2 * L2);
-#endif
-
-  *rtnL = xscaler (L1, L2, mass1, mass2);
-
-  if (w1 <= 0.0 &&
-      w2 <= 0.0)
-    {
-      *rtna   =
-        *rtnb = 0.0;
-#ifdef SANITY
-      /* g_printerr ("\007OUCH. "); */
-#endif
-    }
-  else
-    {
-      *rtna = xscaler (a1, a2, w1, w2);
-      *rtnb = xscaler (b1, b2, w1, w2);
-    }
-#endif
-}
-#endif /* EXPERIMENTAL SECTION */
-
-/***********  /cpercep.c *********   */
diff --git a/extensions/HSL.c b/extensions/HSL.c
new file mode 100644 (file)
index 0000000..827e028
--- /dev/null
@@ -0,0 +1,287 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <math.h>
+#include <string.h>
+
+#include "babl.h"
+#include "base/util.h"
+
+#define MIN(a,b) ((a > b) ? b : a)
+#define MAX(a,b) ((a < b) ? b : a)
+#define EPSILON  1.0e-10
+
+static long  rgba_to_hsla     (char   *src,
+                               char   *dst,
+                               long    samples);
+static long  hsla_to_rgba     (char   *src,
+                               char   *dst,
+                               long    samples);
+static long  rgba_to_hsl      (char   *src,
+                               char   *dst,
+                               long    samples);
+static long  hsl_to_rgba      (char   *src,
+                               char   *dst,
+                               long    samples);
+static void  rgb_to_hsl_step  (double *src,
+                               double *dst);
+static void  hsl_to_rgb_step  (double *src,
+                               double *dst);
+static inline double hue2cpn  (double  p,
+                               double  q,
+                               double  hue);
+int init (void);
+
+
+int
+init (void)
+{
+  babl_component_new ("hue", NULL);
+  babl_component_new ("saturation", NULL);
+  babl_component_new ("lightness", NULL);
+  babl_component_new ("alpha", NULL);
+
+  babl_model_new ("name", "HSLA",
+                  babl_component ("hue"),
+                  babl_component ("saturation"),
+                  babl_component ("lightness"),
+                  babl_component ("alpha"),
+                  NULL);
+  babl_model_new ("name", "HSL",
+                  babl_component ("hue"),
+                  babl_component ("saturation"),
+                  babl_component ("lightness"),
+                  NULL);
+
+
+  babl_conversion_new (babl_model ("RGBA"),
+                       babl_model ("HSLA"),
+                       "linear", rgba_to_hsla,
+                       NULL);
+  babl_conversion_new (babl_model ("RGBA"),
+                       babl_model ("HSL"),
+                       "linear", rgba_to_hsl,
+                       NULL);
+  babl_conversion_new (babl_model ("HSLA"),
+                       babl_model ("RGBA"),
+                       "linear", hsla_to_rgba,
+                       NULL);
+  babl_conversion_new (babl_model ("HSL"),
+                       babl_model ("RGBA"),
+                       "linear", hsl_to_rgba,
+                       NULL);
+
+  babl_format_new ("name", "HSLA float",
+                   babl_model ("HSLA"),
+                   babl_type ("float"),
+                   babl_component ("hue"),
+                   babl_component ("saturation"),
+                   babl_component ("lightness"),
+                   babl_component ("alpha"),
+                   NULL);
+  babl_format_new ("name", "HSL float",
+                   babl_model ("HSL"),
+                   babl_type ("float"),
+                   babl_component ("hue"),
+                   babl_component ("saturation"),
+                   babl_component ("lightness"),
+                   NULL);
+  return 0;
+}
+
+
+static inline void
+rgb_to_hsl_step (double* src,
+                 double* dst)
+{
+
+  double min, max;
+  double hue, saturation, lightness;
+  int cpn_max;
+
+  double red   = linear_to_gamma_2_2 (src[0]);
+  double green = linear_to_gamma_2_2 (src[1]);
+  double blue  = linear_to_gamma_2_2 (src[2]);
+
+  max = MAX (red, MAX (green, blue));
+  min = MIN (red, MIN (green, blue));
+
+  if (max - red < EPSILON)
+    cpn_max = 0;
+  else if (max - green < EPSILON)
+    cpn_max = 1;
+  else
+    cpn_max = 2;
+
+  lightness = (max + min) / 2.0;
+
+  if (max - min < EPSILON)
+    {
+      hue = saturation = 0;
+    }
+  else
+    {
+      double diff = max - min;
+      double sum  = max + min;
+      saturation = lightness > 0.5 ? diff / (2.0 - sum) : diff / sum;
+      switch (cpn_max)
+        {
+        case 0: hue = (green - blue)  / diff + (green < blue ? 6.0 : 0.0); break;
+        case 1: hue = (blue  - red)   / diff + 2.0; break;
+        case 2: hue = (red   - green) / diff + 4.0; break;
+        default: break;
+        }
+      hue /= 6.0;
+    }
+
+  dst[0] = hue;
+  dst[1] = saturation;
+  dst[2] = lightness;
+}
+
+
+static long
+rgba_to_hsla (char *src,
+              char *dst,
+              long  samples)
+{
+  long n = samples;
+
+  while (n--)
+    {
+      double alpha = ((double *) src)[3];
+
+      rgb_to_hsl_step ((double *) src, (double *) dst);
+
+      ((double *) dst)[3] = alpha;
+
+      src += 4 * sizeof (double);
+      dst += 4 * sizeof (double);
+    }
+
+  return samples;
+}
+
+
+static long
+rgba_to_hsl (char *src,
+             char *dst,
+             long  samples)
+{
+  long n = samples;
+
+  while (n--)
+    {
+      rgb_to_hsl_step ((double *) src, (double *) dst);
+
+      src += 4 * sizeof (double);
+      dst += 3 * sizeof (double);
+    }
+
+  return samples;
+}
+
+
+static inline double
+hue2cpn (double p, double q, double hue)
+{
+  if (hue < 0.0) hue += 1.0;
+  if (hue > 1.0) hue -= 1.0;
+  if (hue < 1.0 / 6.0) return p + (q - p) * 6.0 * hue;
+  if (hue < 1.0 / 2.0) return q;
+  if (hue < 2.0 / 3.0) return p + (q - p) * (2.0 / 3.0 - hue) * 6.0;
+  return p;
+}
+
+
+static void
+hsl_to_rgb_step (double *src,
+                 double *dst)
+{
+  double hue        = src[0];
+  double saturation = src[1];
+  double lightness  = src[2];
+
+  double red = 0, green = 0, blue = 0;
+
+  if (saturation < 1e-7)
+    {
+      red = green = blue = lightness;
+    }
+  else
+    {
+      double q = lightness < 0.5 ?
+        lightness * (1 + saturation) :
+        lightness + saturation - lightness * saturation;
+
+      double p = 2 * lightness - q;
+
+      red   = hue2cpn (p, q, hue + 1.0/3.0);
+      green = hue2cpn (p, q, hue);
+      blue  = hue2cpn (p, q, hue - 1.0/3.0);
+    }
+
+  dst[0] = gamma_2_2_to_linear (red);
+  dst[1] = gamma_2_2_to_linear (green);
+  dst[2] = gamma_2_2_to_linear (blue);
+}
+
+
+static long
+hsla_to_rgba (char *src,
+              char *dst,
+              long  samples)
+{
+  long n = samples;
+
+  while (n--)
+    {
+      double alpha = ((double *) src)[3];
+
+      hsl_to_rgb_step ((double *) src, (double *) dst);
+
+      ((double *) dst)[3] = alpha;
+
+      src += 4 * sizeof (double);
+      dst += 4 * sizeof (double);
+    }
+
+  return samples;
+}
+
+
+static long
+hsl_to_rgba (char *src,
+             char *dst,
+             long  samples)
+{
+  long n = samples;
+
+  while (n--)
+    {
+      hsl_to_rgb_step ((double *) src, (double *) dst);
+
+      ((double *) dst)[3] = 1.0;
+
+      src += 3 * sizeof (double);
+      dst += 4 * sizeof (double);
+    }
+
+  return samples;
+}
diff --git a/extensions/HSV.c b/extensions/HSV.c
new file mode 100644 (file)
index 0000000..c830a0c
--- /dev/null
@@ -0,0 +1,357 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2012, Maxime Nicco <maxime.nicco@gmail.fr>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+ /*
+ * Adding support for HSV colorspace
+ */
+
+#include "config.h"
+
+#include <math.h>
+#include <string.h>
+
+#include "babl.h"
+#include "base/util.h"
+
+#define MIN(a,b) (a > b) ? b : a;
+#define MAX(a,b) (a < b) ? b : a;
+#define EPSILON  1.0e-10
+
+static long rgba_to_hsva     (char *src,
+                              char *dst,
+                              long  samples);
+
+static long hsva_to_rgba     (char *src,
+                              char *dst,
+                              long  samples);
+
+static long rgba_to_hsv      (char *src,
+                              char *dst,
+                              long  samples);
+
+static long hsv_to_rgba      (char *src,
+                              char *dst,
+                              long  samples);
+
+static void rgba_to_hsv_step (char *src,
+                              char *dst);
+
+static void hsv_to_rgba_step (char *src,
+                              char *dst);
+
+static void components       (void);
+static void models           (void);
+static void conversions      (void);
+static void formats          (void);
+
+int init (void);
+
+int
+init (void)
+{
+  components  ();
+  models      ();
+  conversions ();
+  formats     ();
+
+  return 0;
+}
+
+
+static void
+components (void)
+{
+  babl_component_new ("hue", NULL);
+  babl_component_new ("saturation", NULL);
+  babl_component_new ("value", NULL);
+  babl_component_new ("alpha", NULL);
+}
+
+static void
+models (void)
+{
+  babl_model_new (
+    "name", "HSVA",
+    babl_component ("hue"),
+    babl_component ("saturation"),
+    babl_component ("value"),
+    babl_component ("alpha"),
+    NULL
+  );
+
+  babl_model_new (
+    "name", "HSV",
+    babl_component ("hue"),
+    babl_component ("saturation"),
+    babl_component ("value"),
+    NULL
+  );
+}
+
+static void
+conversions (void)
+{
+  babl_conversion_new (
+    babl_model ("RGBA"),
+    babl_model ("HSVA"),
+    "linear", rgba_to_hsva,
+    NULL
+  );
+
+  babl_conversion_new (
+    babl_model ("RGBA"),
+    babl_model ("HSV"),
+    "linear", rgba_to_hsv,
+    NULL
+  );
+
+  babl_conversion_new (
+    babl_model ("HSVA"),
+    babl_model ("RGBA"),
+    "linear", hsva_to_rgba,
+    NULL
+  );
+
+  babl_conversion_new (
+    babl_model ("HSV"),
+    babl_model ("RGBA"),
+    "linear", hsv_to_rgba,
+    NULL
+  );
+}
+
+static void
+formats (void)
+{
+  babl_format_new (
+    "name", "HSVA float",
+    babl_model ("HSVA"),
+    babl_type ("float"),
+    babl_component ("hue"),
+    babl_component ("saturation"),
+    babl_component ("value"),
+    babl_component ("alpha"),
+    NULL
+  );
+
+  babl_format_new (
+    "name", "HSV float",
+    babl_model ("HSV"),
+    babl_type ("float"),
+    babl_component ("hue"),
+    babl_component ("saturation"),
+    babl_component ("value"),
+    NULL
+  );
+}
+
+static void
+rgba_to_hsv_step (char *src,
+                  char *dst)
+{
+  double hue, saturation, value;
+  double min, chroma;
+
+  double red   = linear_to_gamma_2_2 (((double *) src)[0]);
+  double green = linear_to_gamma_2_2 (((double *) src)[1]);
+  double blue  = linear_to_gamma_2_2 (((double *) src)[2]);
+
+  if (red > green)
+    {
+      value = MAX (red, blue);
+      min   = MIN (green, blue);
+    }
+  else
+    {
+      value = MAX (green, blue);
+      min   = MIN (red, blue);
+    }
+
+  chroma = value - min;
+
+  if (value < EPSILON)
+    saturation = 0.0;
+  else
+    saturation = chroma / value;
+
+  if (saturation < EPSILON)
+    {
+      hue = 0.0;
+    }
+  else
+    {
+      if (fabs (red - value) < EPSILON)
+        {
+          hue = (green - blue) / chroma;
+
+          if (hue < 0.0)
+            hue += 6.0;
+        }
+      else if (fabs (green - value) < EPSILON)
+        hue = 2.0 + (blue - red) / chroma;
+      else
+        hue = 4.0 + (red - green) / chroma;
+
+      hue /= 6.0;
+    }
+
+  ((double *) dst)[0] = hue;
+  ((double *) dst)[1] = saturation;
+  ((double *) dst)[2] = value;
+}
+
+
+static void
+hsv_to_rgba_step (char *src,
+                  char *dst)
+{
+  double hue        = ((double *) src)[0];
+  double saturation = ((double *) src)[1];
+  double value      = ((double *) src)[2];
+
+  double red = 0, green = 0, blue = 0;
+
+  double chroma, h_tmp, x, min;
+
+  chroma = saturation * value;
+  h_tmp = hue * 6.0;
+  x = chroma * (1.0 - fabs (fmod (h_tmp, 2.0) - 1.0));
+
+  if (h_tmp < 1.0)
+    {
+      red   = chroma;
+      green = x;
+    }
+  else if (h_tmp < 2.0)
+    {
+      red   = x;
+      green = chroma;
+    }
+  else if (h_tmp < 3.0)
+    {
+      green = chroma;
+      blue  = x;
+    }
+  else if (h_tmp < 4.0)
+    {
+      green = x;
+      blue  = chroma;
+    }
+  else if (h_tmp < 5.0)
+    {
+      red  = x;
+      blue = chroma;
+    }
+  else if (h_tmp < 6.0)
+    {
+      red  = chroma;
+      blue = x;
+    }
+
+  min = value - chroma;
+
+  red   += min;
+  green += min;
+  blue  += min;
+
+  ((double *) dst)[0] = gamma_2_2_to_linear (red);
+  ((double *) dst)[1] = gamma_2_2_to_linear (green);
+  ((double *) dst)[2] = gamma_2_2_to_linear (blue);
+}
+
+static long
+rgba_to_hsva (char *src,
+              char *dst,
+              long  samples)
+{
+  long n = samples;
+
+  while (n--)
+    {
+      double alpha = ((double *) src)[3];
+
+      rgba_to_hsv_step (src, dst);
+
+      ((double *) dst)[3] = alpha;
+
+      src += 4 * sizeof (double);
+      dst += 4 * sizeof (double);
+    }
+
+  return samples;
+}
+
+static long
+hsva_to_rgba (char *src,
+              char *dst,
+              long  samples)
+{
+  long n = samples;
+
+  while (n--)
+    {
+      double alpha = ((double *) src)[3];
+
+      hsv_to_rgba_step (src, dst);
+
+      ((double *) dst)[3] = alpha;
+
+      src += 4 * sizeof (double);
+      dst += 4 * sizeof (double);
+    }
+
+  return samples;
+}
+
+static long
+rgba_to_hsv (char *src,
+             char *dst,
+             long  samples)
+{
+  long n = samples;
+
+  while (n--)
+    {
+      rgba_to_hsv_step (src, dst);
+
+      src += 4 * sizeof (double);
+      dst += 3 * sizeof (double);
+    }
+
+  return samples;
+}
+
+static long
+hsv_to_rgba (char *src,
+             char *dst,
+             long  samples)
+{
+  long n = samples;
+
+  while (n--)
+    {
+      hsv_to_rgba_step (src, dst);
+
+      ((double *) dst)[3] = 1.0;
+
+      src += 3 * sizeof (double);
+      dst += 4 * sizeof (double);
+    }
+
+  return samples;
+}
index 4d2d4cbe981bbd1d981932f16b4222e7715d37b3..395473978476088a45afedf73de196ff35416a37 100644 (file)
@@ -21,22 +21,40 @@ ext_LTLIBRARIES = \
        gggl-lies.la    \
        gggl.la         \
        gimp-8bit.la    \
-       float.la    \
-       fast-float.la    \
+       grey.la         \
+       float.la        \
+       fast-float.la   \
        naive-CMYK.la   \
-       sse-fixups.la
+       HSL.la          \
+       HSV.la          \
+       simple.la       \
+       sse2-float.la   \
+       sse2-int8.la    \
+       sse2-int16.la   \
+       two-table.la    \
+       ycbcr.la
 
-cairo_la_SOURCES = cairo.c
+cairo_la_SOURCES = cairo.c cairo-tables.h
 CIE_la_SOURCES = CIE.c
+simple_la_SOURCES = simple.c
 gegl_fixups_la_SOURCES = gegl-fixups.c
 gggl_lies_la_SOURCES = gggl-lies.c
 gggl_la_SOURCES = gggl.c
 gimp_8bit_la_SOURCES = gimp-8bit.c
+grey_la_SOURCES = grey.c
 naive_CMYK_la_SOURCES = naive-CMYK.c
-sse_fixups_la_SOURCES = sse-fixups.c
+HSL_la_SOURCES = HSL.c
+HSV_la_SOURCES = HSV.c
+sse2_float_la_SOURCES = sse2-float.c
+sse2_int8_la_SOURCES = sse2-int8.c
+sse2_int16_la_SOURCES = sse2-int16.c
+two_table_la_SOURCES = two-table.c two-table-tables.h
+ycbcr_la_SOURCES = ycbcr.c
 float_la_SOURCES = float.c
 fast_float_la_SOURCES = fast-float.c
 
 LIBS = $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la $(MATH_LIB)
 
-sse_fixups_la_CFLAGS = $(MMX_EXTRA_CFLAGS) $(SSE_EXTRA_CFLAGS)
+sse2_float_la_CFLAGS = $(SSE2_EXTRA_CFLAGS)
+sse2_int8_la_CFLAGS = $(SSE2_EXTRA_CFLAGS)
+sse2_int16_la_CFLAGS = $(SSE2_EXTRA_CFLAGS)
index adb2998d82e0f6f55ab23bbc326435868ba52814..a6816c5d439b185e48c7fdbfd8b1675a933f1d04 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 
 
 VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -35,15 +52,15 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
+target_triplet = @target@
 subdir = extensions
 DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
        $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/introspection.m4 \
-       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
-       $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -85,6 +102,12 @@ CIE_la_OBJECTS = $(am_CIE_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
+HSL_la_LIBADD =
+am_HSL_la_OBJECTS = HSL.lo
+HSL_la_OBJECTS = $(am_HSL_la_OBJECTS)
+HSV_la_LIBADD =
+am_HSV_la_OBJECTS = HSV.lo
+HSV_la_OBJECTS = $(am_HSV_la_OBJECTS)
 cairo_la_LIBADD =
 am_cairo_la_OBJECTS = cairo.lo
 cairo_la_OBJECTS = $(am_cairo_la_OBJECTS)
@@ -106,15 +129,39 @@ gggl_la_OBJECTS = $(am_gggl_la_OBJECTS)
 gimp_8bit_la_LIBADD =
 am_gimp_8bit_la_OBJECTS = gimp-8bit.lo
 gimp_8bit_la_OBJECTS = $(am_gimp_8bit_la_OBJECTS)
+grey_la_LIBADD =
+am_grey_la_OBJECTS = grey.lo
+grey_la_OBJECTS = $(am_grey_la_OBJECTS)
 naive_CMYK_la_LIBADD =
 am_naive_CMYK_la_OBJECTS = naive-CMYK.lo
 naive_CMYK_la_OBJECTS = $(am_naive_CMYK_la_OBJECTS)
-sse_fixups_la_LIBADD =
-am_sse_fixups_la_OBJECTS = sse_fixups_la-sse-fixups.lo
-sse_fixups_la_OBJECTS = $(am_sse_fixups_la_OBJECTS)
-sse_fixups_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sse_fixups_la_CFLAGS) \
+simple_la_LIBADD =
+am_simple_la_OBJECTS = simple.lo
+simple_la_OBJECTS = $(am_simple_la_OBJECTS)
+sse2_float_la_LIBADD =
+am_sse2_float_la_OBJECTS = sse2_float_la-sse2-float.lo
+sse2_float_la_OBJECTS = $(am_sse2_float_la_OBJECTS)
+sse2_float_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sse2_float_la_CFLAGS) \
+       $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+sse2_int16_la_LIBADD =
+am_sse2_int16_la_OBJECTS = sse2_int16_la-sse2-int16.lo
+sse2_int16_la_OBJECTS = $(am_sse2_int16_la_OBJECTS)
+sse2_int16_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sse2_int16_la_CFLAGS) \
        $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+sse2_int8_la_LIBADD =
+am_sse2_int8_la_OBJECTS = sse2_int8_la-sse2-int8.lo
+sse2_int8_la_OBJECTS = $(am_sse2_int8_la_OBJECTS)
+sse2_int8_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sse2_int8_la_CFLAGS) \
+       $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+two_table_la_LIBADD =
+am_two_table_la_OBJECTS = two-table.lo
+two_table_la_OBJECTS = $(am_two_table_la_OBJECTS)
+ycbcr_la_LIBADD =
+am_ycbcr_la_OBJECTS = ycbcr.lo
+ycbcr_la_OBJECTS = $(am_ycbcr_la_OBJECTS)
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
@@ -141,16 +188,29 @@ am__v_CCLD_0 = @echo "  CCLD  " $@;
 AM_V_GEN = $(am__v_GEN_@AM_V@)
 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
 am__v_GEN_0 = @echo "  GEN   " $@;
-SOURCES = $(CIE_la_SOURCES) $(cairo_la_SOURCES) \
-       $(fast_float_la_SOURCES) $(float_la_SOURCES) \
-       $(gegl_fixups_la_SOURCES) $(gggl_lies_la_SOURCES) \
-       $(gggl_la_SOURCES) $(gimp_8bit_la_SOURCES) \
-       $(naive_CMYK_la_SOURCES) $(sse_fixups_la_SOURCES)
-DIST_SOURCES = $(CIE_la_SOURCES) $(cairo_la_SOURCES) \
-       $(fast_float_la_SOURCES) $(float_la_SOURCES) \
-       $(gegl_fixups_la_SOURCES) $(gggl_lies_la_SOURCES) \
-       $(gggl_la_SOURCES) $(gimp_8bit_la_SOURCES) \
-       $(naive_CMYK_la_SOURCES) $(sse_fixups_la_SOURCES)
+SOURCES = $(CIE_la_SOURCES) $(HSL_la_SOURCES) $(HSV_la_SOURCES) \
+       $(cairo_la_SOURCES) $(fast_float_la_SOURCES) \
+       $(float_la_SOURCES) $(gegl_fixups_la_SOURCES) \
+       $(gggl_lies_la_SOURCES) $(gggl_la_SOURCES) \
+       $(gimp_8bit_la_SOURCES) $(grey_la_SOURCES) \
+       $(naive_CMYK_la_SOURCES) $(simple_la_SOURCES) \
+       $(sse2_float_la_SOURCES) $(sse2_int16_la_SOURCES) \
+       $(sse2_int8_la_SOURCES) $(two_table_la_SOURCES) \
+       $(ycbcr_la_SOURCES)
+DIST_SOURCES = $(CIE_la_SOURCES) $(HSL_la_SOURCES) $(HSV_la_SOURCES) \
+       $(cairo_la_SOURCES) $(fast_float_la_SOURCES) \
+       $(float_la_SOURCES) $(gegl_fixups_la_SOURCES) \
+       $(gggl_lies_la_SOURCES) $(gggl_la_SOURCES) \
+       $(gimp_8bit_la_SOURCES) $(grey_la_SOURCES) \
+       $(naive_CMYK_la_SOURCES) $(simple_la_SOURCES) \
+       $(sse2_float_la_SOURCES) $(sse2_int16_la_SOURCES) \
+       $(sse2_int8_la_SOURCES) $(two_table_la_SOURCES) \
+       $(ycbcr_la_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 HEADERS = $(noinst_HEADERS)
 ETAGS = etags
 CTAGS = ctags
@@ -201,14 +261,6 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
-INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
-INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
-INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
-INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
-INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
-INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
-INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -238,18 +290,15 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEP = @PATH_SEP@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
 RANLIB = @RANLIB@
 RSVG = @RSVG@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SHREXT = @SHREXT@
+SSE2_EXTRA_CFLAGS = @SSE2_EXTRA_CFLAGS@
 SSE_EXTRA_CFLAGS = @SSE_EXTRA_CFLAGS@
 STRIP = @STRIP@
-VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 W3M = @W3M@
 WEBSITE_HOST = @WEBSITE_HOST@
@@ -302,7 +351,11 @@ sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sysconfdir = @sysconfdir@
+target = @target@
 target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
@@ -323,22 +376,40 @@ ext_LTLIBRARIES = \
        gggl-lies.la    \
        gggl.la         \
        gimp-8bit.la    \
-       float.la    \
-       fast-float.la    \
+       grey.la         \
+       float.la        \
+       fast-float.la   \
        naive-CMYK.la   \
-       sse-fixups.la
-
-cairo_la_SOURCES = cairo.c
+       HSL.la          \
+       HSV.la          \
+       simple.la       \
+       sse2-float.la   \
+       sse2-int8.la    \
+       sse2-int16.la   \
+       two-table.la    \
+       ycbcr.la
+
+cairo_la_SOURCES = cairo.c cairo-tables.h
 CIE_la_SOURCES = CIE.c
+simple_la_SOURCES = simple.c
 gegl_fixups_la_SOURCES = gegl-fixups.c
 gggl_lies_la_SOURCES = gggl-lies.c
 gggl_la_SOURCES = gggl.c
 gimp_8bit_la_SOURCES = gimp-8bit.c
+grey_la_SOURCES = grey.c
 naive_CMYK_la_SOURCES = naive-CMYK.c
-sse_fixups_la_SOURCES = sse-fixups.c
+HSL_la_SOURCES = HSL.c
+HSV_la_SOURCES = HSV.c
+sse2_float_la_SOURCES = sse2-float.c
+sse2_int8_la_SOURCES = sse2-int8.c
+sse2_int16_la_SOURCES = sse2-int16.c
+two_table_la_SOURCES = two-table.c two-table-tables.h
+ycbcr_la_SOURCES = ycbcr.c
 float_la_SOURCES = float.c
 fast_float_la_SOURCES = fast-float.c
-sse_fixups_la_CFLAGS = $(MMX_EXTRA_CFLAGS) $(SSE_EXTRA_CFLAGS)
+sse2_float_la_CFLAGS = $(SSE2_EXTRA_CFLAGS)
+sse2_int8_la_CFLAGS = $(SSE2_EXTRA_CFLAGS)
+sse2_int16_la_CFLAGS = $(SSE2_EXTRA_CFLAGS)
 all: all-am
 
 .SUFFIXES:
@@ -375,7 +446,6 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 install-extLTLIBRARIES: $(ext_LTLIBRARIES)
        @$(NORMAL_INSTALL)
-       test -z "$(extdir)" || $(MKDIR_P) "$(DESTDIR)$(extdir)"
        @list='$(ext_LTLIBRARIES)'; test -n "$(extdir)" || list=; \
        list2=; for p in $$list; do \
          if test -f $$p; then \
@@ -383,6 +453,8 @@ install-extLTLIBRARIES: $(ext_LTLIBRARIES)
          else :; fi; \
        done; \
        test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(extdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(extdir)" || exit 1; \
          echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(extdir)'"; \
          $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(extdir)"; \
        }
@@ -406,6 +478,10 @@ clean-extLTLIBRARIES:
        done
 CIE.la: $(CIE_la_OBJECTS) $(CIE_la_DEPENDENCIES) $(EXTRA_CIE_la_DEPENDENCIES) 
        $(AM_V_CCLD)$(LINK) -rpath $(extdir) $(CIE_la_OBJECTS) $(CIE_la_LIBADD) $(LIBS)
+HSL.la: $(HSL_la_OBJECTS) $(HSL_la_DEPENDENCIES) $(EXTRA_HSL_la_DEPENDENCIES) 
+       $(AM_V_CCLD)$(LINK) -rpath $(extdir) $(HSL_la_OBJECTS) $(HSL_la_LIBADD) $(LIBS)
+HSV.la: $(HSV_la_OBJECTS) $(HSV_la_DEPENDENCIES) $(EXTRA_HSV_la_DEPENDENCIES) 
+       $(AM_V_CCLD)$(LINK) -rpath $(extdir) $(HSV_la_OBJECTS) $(HSV_la_LIBADD) $(LIBS)
 cairo.la: $(cairo_la_OBJECTS) $(cairo_la_DEPENDENCIES) $(EXTRA_cairo_la_DEPENDENCIES) 
        $(AM_V_CCLD)$(LINK) -rpath $(extdir) $(cairo_la_OBJECTS) $(cairo_la_LIBADD) $(LIBS)
 fast-float.la: $(fast_float_la_OBJECTS) $(fast_float_la_DEPENDENCIES) $(EXTRA_fast_float_la_DEPENDENCIES) 
@@ -420,10 +496,22 @@ gggl.la: $(gggl_la_OBJECTS) $(gggl_la_DEPENDENCIES) $(EXTRA_gggl_la_DEPENDENCIES
        $(AM_V_CCLD)$(LINK) -rpath $(extdir) $(gggl_la_OBJECTS) $(gggl_la_LIBADD) $(LIBS)
 gimp-8bit.la: $(gimp_8bit_la_OBJECTS) $(gimp_8bit_la_DEPENDENCIES) $(EXTRA_gimp_8bit_la_DEPENDENCIES) 
        $(AM_V_CCLD)$(LINK) -rpath $(extdir) $(gimp_8bit_la_OBJECTS) $(gimp_8bit_la_LIBADD) $(LIBS)
+grey.la: $(grey_la_OBJECTS) $(grey_la_DEPENDENCIES) $(EXTRA_grey_la_DEPENDENCIES) 
+       $(AM_V_CCLD)$(LINK) -rpath $(extdir) $(grey_la_OBJECTS) $(grey_la_LIBADD) $(LIBS)
 naive-CMYK.la: $(naive_CMYK_la_OBJECTS) $(naive_CMYK_la_DEPENDENCIES) $(EXTRA_naive_CMYK_la_DEPENDENCIES) 
        $(AM_V_CCLD)$(LINK) -rpath $(extdir) $(naive_CMYK_la_OBJECTS) $(naive_CMYK_la_LIBADD) $(LIBS)
-sse-fixups.la: $(sse_fixups_la_OBJECTS) $(sse_fixups_la_DEPENDENCIES) $(EXTRA_sse_fixups_la_DEPENDENCIES) 
-       $(AM_V_CCLD)$(sse_fixups_la_LINK) -rpath $(extdir) $(sse_fixups_la_OBJECTS) $(sse_fixups_la_LIBADD) $(LIBS)
+simple.la: $(simple_la_OBJECTS) $(simple_la_DEPENDENCIES) $(EXTRA_simple_la_DEPENDENCIES) 
+       $(AM_V_CCLD)$(LINK) -rpath $(extdir) $(simple_la_OBJECTS) $(simple_la_LIBADD) $(LIBS)
+sse2-float.la: $(sse2_float_la_OBJECTS) $(sse2_float_la_DEPENDENCIES) $(EXTRA_sse2_float_la_DEPENDENCIES) 
+       $(AM_V_CCLD)$(sse2_float_la_LINK) -rpath $(extdir) $(sse2_float_la_OBJECTS) $(sse2_float_la_LIBADD) $(LIBS)
+sse2-int16.la: $(sse2_int16_la_OBJECTS) $(sse2_int16_la_DEPENDENCIES) $(EXTRA_sse2_int16_la_DEPENDENCIES) 
+       $(AM_V_CCLD)$(sse2_int16_la_LINK) -rpath $(extdir) $(sse2_int16_la_OBJECTS) $(sse2_int16_la_LIBADD) $(LIBS)
+sse2-int8.la: $(sse2_int8_la_OBJECTS) $(sse2_int8_la_DEPENDENCIES) $(EXTRA_sse2_int8_la_DEPENDENCIES) 
+       $(AM_V_CCLD)$(sse2_int8_la_LINK) -rpath $(extdir) $(sse2_int8_la_OBJECTS) $(sse2_int8_la_LIBADD) $(LIBS)
+two-table.la: $(two_table_la_OBJECTS) $(two_table_la_DEPENDENCIES) $(EXTRA_two_table_la_DEPENDENCIES) 
+       $(AM_V_CCLD)$(LINK) -rpath $(extdir) $(two_table_la_OBJECTS) $(two_table_la_LIBADD) $(LIBS)
+ycbcr.la: $(ycbcr_la_OBJECTS) $(ycbcr_la_DEPENDENCIES) $(EXTRA_ycbcr_la_DEPENDENCIES) 
+       $(AM_V_CCLD)$(LINK) -rpath $(extdir) $(ycbcr_la_OBJECTS) $(ycbcr_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -432,6 +520,8 @@ distclean-compile:
        -rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CIE.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HSL.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HSV.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast-float.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/float.Plo@am__quote@
@@ -439,8 +529,14 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gggl-lies.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gggl.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gimp-8bit.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grey.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/naive-CMYK.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sse_fixups_la-sse-fixups.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sse2_float_la-sse2-float.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sse2_int16_la-sse2-int16.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sse2_int8_la-sse2-int8.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/two-table.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ycbcr.Plo@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -463,12 +559,26 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
-sse_fixups_la-sse-fixups.lo: sse-fixups.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sse_fixups_la_CFLAGS) $(CFLAGS) -MT sse_fixups_la-sse-fixups.lo -MD -MP -MF $(DEPDIR)/sse_fixups_la-sse-fixups.Tpo -c -o sse_fixups_la-sse-fixups.lo `test -f 'sse-fixups.c' || echo '$(srcdir)/'`sse-fixups.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/sse_fixups_la-sse-fixups.Tpo $(DEPDIR)/sse_fixups_la-sse-fixups.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='sse-fixups.c' object='sse_fixups_la-sse-fixups.lo' libtool=yes @AMDEPBACKSLASH@
+sse2_float_la-sse2-float.lo: sse2-float.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sse2_float_la_CFLAGS) $(CFLAGS) -MT sse2_float_la-sse2-float.lo -MD -MP -MF $(DEPDIR)/sse2_float_la-sse2-float.Tpo -c -o sse2_float_la-sse2-float.lo `test -f 'sse2-float.c' || echo '$(srcdir)/'`sse2-float.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/sse2_float_la-sse2-float.Tpo $(DEPDIR)/sse2_float_la-sse2-float.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='sse2-float.c' object='sse2_float_la-sse2-float.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sse2_float_la_CFLAGS) $(CFLAGS) -c -o sse2_float_la-sse2-float.lo `test -f 'sse2-float.c' || echo '$(srcdir)/'`sse2-float.c
+
+sse2_int16_la-sse2-int16.lo: sse2-int16.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sse2_int16_la_CFLAGS) $(CFLAGS) -MT sse2_int16_la-sse2-int16.lo -MD -MP -MF $(DEPDIR)/sse2_int16_la-sse2-int16.Tpo -c -o sse2_int16_la-sse2-int16.lo `test -f 'sse2-int16.c' || echo '$(srcdir)/'`sse2-int16.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/sse2_int16_la-sse2-int16.Tpo $(DEPDIR)/sse2_int16_la-sse2-int16.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='sse2-int16.c' object='sse2_int16_la-sse2-int16.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sse2_int16_la_CFLAGS) $(CFLAGS) -c -o sse2_int16_la-sse2-int16.lo `test -f 'sse2-int16.c' || echo '$(srcdir)/'`sse2-int16.c
+
+sse2_int8_la-sse2-int8.lo: sse2-int8.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sse2_int8_la_CFLAGS) $(CFLAGS) -MT sse2_int8_la-sse2-int8.lo -MD -MP -MF $(DEPDIR)/sse2_int8_la-sse2-int8.Tpo -c -o sse2_int8_la-sse2-int8.lo `test -f 'sse2-int8.c' || echo '$(srcdir)/'`sse2-int8.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/sse2_int8_la-sse2-int8.Tpo $(DEPDIR)/sse2_int8_la-sse2-int8.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='sse2-int8.c' object='sse2_int8_la-sse2-int8.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sse_fixups_la_CFLAGS) $(CFLAGS) -c -o sse_fixups_la-sse-fixups.lo `test -f 'sse-fixups.c' || echo '$(srcdir)/'`sse-fixups.c
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sse2_int8_la_CFLAGS) $(CFLAGS) -c -o sse2_int8_la-sse2-int8.lo `test -f 'sse2-int8.c' || echo '$(srcdir)/'`sse2-int8.c
 
 mostlyclean-libtool:
        -rm -f *.lo
diff --git a/extensions/cairo-tables.h b/extensions/cairo-tables.h
new file mode 100644 (file)
index 0000000..d814b73
--- /dev/null
@@ -0,0 +1,5027 @@
+/* Gamma table generated from a babl conversion of Y to Y' */
+static const unsigned short linear_to_gamma16[65536] =
+{
+0,13,26,39,52,65,78,90,103,116,129,142,155,168,181,194,207,220,233,245,258,271,
+284,297,310,323,336,349,362,375,388,401,413,426,439,452,465,478,491,504,517,530,
+543,556,568,581,594,607,620,633,646,659,672,685,698,711,724,736,749,762,775,788,
+801,814,827,840,853,866,879,891,904,917,930,943,956,969,982,995,1008,1021,1034,
+1047,1059,1072,1085,1098,1111,1124,1137,1150,1163,1176,1189,1202,1214,1227,1240,
+1253,1266,1279,1292,1305,1318,1331,1344,1357,1370,1382,1395,1408,1421,1434,1447,
+1460,1473,1486,1499,1512,1525,1537,1550,1563,1576,1589,1602,1615,1628,1641,1654,
+1667,1680,1693,1705,1718,1731,1744,1757,1770,1783,1796,1809,1822,1835,1848,1860,
+1873,1886,1899,1912,1925,1938,1951,1964,1977,1990,2003,2016,2028,2041,2054,2067,
+2080,2093,2106,2119,2132,2145,2158,2171,2183,2196,2209,2222,2235,2248,2261,2274,
+2287,2300,2313,2326,2339,2351,2364,2377,2390,2403,2416,2429,2442,2455,2468,2481,
+2494,2506,2519,2532,2545,2558,2571,2584,2597,2610,2623,2636,2649,2661,2674,2687,
+2699,2712,2724,2737,2749,2762,2774,2786,2799,2811,2823,2835,2848,2860,2872,2884,
+2896,2908,2920,2932,2944,2956,2968,2979,2991,3003,3015,3027,3038,3050,3062,3073,
+3085,3096,3108,3119,3131,3142,3154,3165,3176,3188,3199,3210,3222,3233,3244,3255,
+3266,3277,3288,3300,3311,3322,3333,3344,3355,3366,3376,3387,3398,3409,3420,3431,
+3441,3452,3463,3474,3484,3495,3505,3516,3527,3537,3548,3558,3569,3579,3590,3600,
+3611,3621,3631,3642,3652,3662,3673,3683,3693,3703,3714,3724,3734,3744,3754,3764,
+3774,3784,3795,3805,3815,3825,3835,3844,3854,3864,3874,3884,3894,3904,3914,3923,
+3933,3943,3953,3963,3972,3982,3992,4001,4011,4021,4030,4040,4049,4059,4069,4078,
+4088,4097,4107,4116,4126,4135,4144,4154,4163,4173,4182,4191,4201,4210,4219,4228,
+4238,4247,4256,4265,4275,4284,4293,4302,4311,4320,4330,4339,4348,4357,4366,4375,
+4384,4393,4402,4411,4420,4429,4438,4447,4456,4465,4473,4482,4491,4500,4509,4518,
+4526,4535,4544,4553,4562,4570,4579,4588,4596,4605,4614,4622,4631,4640,4648,4657,
+4666,4674,4683,4691,4700,4708,4717,4725,4734,4742,4751,4759,4768,4776,4785,4793,
+4801,4810,4818,4827,4835,4843,4852,4860,4868,4877,4885,4893,4901,4910,4918,4926,
+4934,4943,4951,4959,4967,4975,4984,4992,5000,5008,5016,5024,5032,5040,5048,5056,
+5064,5073,5081,5089,5097,5105,5113,5121,5129,5136,5144,5152,5160,5168,5176,5184,
+5192,5200,5208,5215,5223,5231,5239,5247,5255,5262,5270,5278,5286,5294,5301,5309,
+5317,5324,5332,5340,5348,5355,5363,5371,5378,5386,5394,5401,5409,5416,5424,5432,
+5439,5447,5454,5462,5469,5477,5485,5492,5500,5507,5515,5522,5530,5537,5545,5552,
+5559,5567,5574,5582,5589,5597,5604,5611,5619,5626,5633,5641,5648,5655,5663,5670,
+5677,5685,5692,5699,5707,5714,5721,5728,5736,5743,5750,5757,5765,5772,5779,5786,
+5793,5801,5808,5815,5822,5829,5836,5843,5851,5858,5865,5872,5879,5886,5893,5900,
+5907,5914,5921,5929,5936,5943,5950,5957,5964,5971,5978,5985,5992,5999,6006,6013,
+6019,6026,6033,6040,6047,6054,6061,6068,6075,6082,6089,6096,6102,6109,6116,6123,
+6130,6137,6143,6150,6157,6164,6171,6178,6184,6191,6198,6205,6211,6218,6225,6232,
+6238,6245,6252,6259,6265,6272,6279,6285,6292,6299,6305,6312,6319,6325,6332,6339,
+6345,6352,6359,6365,6372,6378,6385,6392,6398,6405,6411,6418,6424,6431,6438,6444,
+6451,6457,6464,6470,6477,6483,6490,6496,6503,6509,6516,6522,6529,6535,6542,6548,
+6554,6561,6567,6574,6580,6587,6593,6599,6606,6612,6619,6625,6631,6638,6644,6650,
+6657,6663,6670,6676,6682,6689,6695,6701,6708,6714,6720,6726,6733,6739,6745,6752,
+6758,6764,6770,6777,6783,6789,6795,6802,6808,6814,6820,6826,6833,6839,6845,6851,
+6857,6864,6870,6876,6882,6888,6894,6901,6907,6913,6919,6925,6931,6937,6943,6950,
+6956,6962,6968,6974,6980,6986,6992,6998,7004,7010,7016,7023,7029,7035,7041,7047,
+7053,7059,7065,7071,7077,7083,7089,7095,7101,7107,7113,7119,7125,7131,7137,7143,
+7148,7154,7160,7166,7172,7178,7184,7190,7196,7202,7208,7214,7220,7225,7231,7237,
+7243,7249,7255,7261,7267,7272,7278,7284,7290,7296,7302,7307,7313,7319,7325,7331,
+7337,7342,7348,7354,7360,7366,7371,7377,7383,7389,7394,7400,7406,7412,7417,7423,
+7429,7435,7440,7446,7452,7458,7463,7469,7475,7480,7486,7492,7498,7503,7509,7515,
+7520,7526,7532,7537,7543,7549,7554,7560,7566,7571,7577,7582,7588,7594,7599,7605,
+7611,7616,7622,7627,7633,7639,7644,7650,7655,7661,7666,7672,7678,7683,7689,7694,
+7700,7705,7711,7716,7722,7727,7733,7739,7744,7750,7755,7761,7766,7772,7777,7783,
+7788,7794,7799,7805,7810,7815,7821,7826,7832,7837,7843,7848,7854,7859,7865,7870,
+7875,7881,7886,7892,7897,7902,7908,7913,7919,7924,7930,7935,7940,7946,7951,7956,
+7962,7967,7973,7978,7983,7989,7994,7999,8005,8010,8015,8021,8026,8031,8037,8042,
+8047,8053,8058,8063,8069,8074,8079,8084,8090,8095,8100,8106,8111,8116,8121,8127,
+8132,8137,8142,8148,8153,8158,8164,8169,8174,8179,8184,8190,8195,8200,8205,8211,
+8216,8221,8226,8231,8237,8242,8247,8252,8257,8263,8268,8273,8278,8283,8288,8294,
+8299,8304,8309,8314,8319,8325,8330,8335,8340,8345,8350,8355,8360,8366,8371,8376,
+8381,8386,8391,8396,8401,8406,8412,8417,8422,8427,8432,8437,8442,8447,8452,8457,
+8462,8467,8472,8478,8483,8488,8493,8498,8503,8508,8513,8518,8523,8528,8533,8538,
+8543,8548,8553,8558,8563,8568,8573,8578,8583,8588,8593,8598,8603,8608,8613,8618,
+8623,8628,8633,8638,8643,8648,8653,8658,8663,8667,8672,8677,8682,8687,8692,8697,
+8702,8707,8712,8717,8722,8727,8732,8736,8741,8746,8751,8756,8761,8766,8771,8776,
+8780,8785,8790,8795,8800,8805,8810,8815,8819,8824,8829,8834,8839,8844,8849,8853,
+8858,8863,8868,8873,8878,8882,8887,8892,8897,8902,8907,8911,8916,8921,8926,8931,
+8935,8940,8945,8950,8955,8959,8964,8969,8974,8978,8983,8988,8993,8998,9002,9007,
+9012,9017,9021,9026,9031,9036,9040,9045,9050,9055,9059,9064,9069,9073,9078,9083,
+9088,9092,9097,9102,9106,9111,9116,9121,9125,9130,9135,9139,9144,9149,9153,9158,
+9163,9167,9172,9177,9181,9186,9191,9195,9200,9205,9209,9214,9219,9223,9228,9233,
+9237,9242,9247,9251,9256,9260,9265,9270,9274,9279,9284,9288,9293,9297,9302,9307,
+9311,9316,9320,9325,9330,9334,9339,9343,9348,9353,9357,9362,9366,9371,9376,9380,
+9385,9389,9394,9398,9403,9407,9412,9417,9421,9426,9430,9435,9439,9444,9448,9453,
+9457,9462,9466,9471,9476,9480,9485,9489,9494,9498,9503,9507,9512,9516,9521,9525,
+9530,9534,9539,9543,9548,9552,9557,9561,9566,9570,9575,9579,9583,9588,9592,9597,
+9601,9606,9610,9615,9619,9624,9628,9633,9637,9641,9646,9650,9655,9659,9664,9668,
+9672,9677,9681,9686,9690,9695,9699,9703,9708,9712,9717,9721,9725,9730,9734,9739,
+9743,9747,9752,9756,9761,9765,9769,9774,9778,9783,9787,9791,9796,9800,9804,9809,
+9813,9818,9822,9826,9831,9835,9839,9844,9848,9852,9857,9861,9865,9870,9874,9878,
+9883,9887,9891,9896,9900,9904,9909,9913,9917,9922,9926,9930,9935,9939,9943,9947,
+9952,9956,9960,9965,9969,9973,9978,9982,9986,9990,9995,9999,10003,10008,10012,
+10016,10020,10025,10029,10033,10037,10042,10046,10050,10055,10059,10063,10067,
+10072,10076,10080,10084,10088,10093,10097,10101,10105,10110,10114,10118,10122,
+10127,10131,10135,10139,10143,10148,10152,10156,10160,10165,10169,10173,10177,
+10181,10186,10190,10194,10198,10202,10207,10211,10215,10219,10223,10227,10232,
+10236,10240,10244,10248,10253,10257,10261,10265,10269,10273,10278,10282,10286,
+10290,10294,10298,10302,10307,10311,10315,10319,10323,10327,10332,10336,10340,
+10344,10348,10352,10356,10360,10365,10369,10373,10377,10381,10385,10389,10393,
+10398,10402,10406,10410,10414,10418,10422,10426,10430,10434,10439,10443,10447,
+10451,10455,10459,10463,10467,10471,10475,10479,10483,10488,10492,10496,10500,
+10504,10508,10512,10516,10520,10524,10528,10532,10536,10540,10544,10548,10553,
+10557,10561,10565,10569,10573,10577,10581,10585,10589,10593,10597,10601,10605,
+10609,10613,10617,10621,10625,10629,10633,10637,10641,10645,10649,10653,10657,
+10661,10665,10669,10673,10677,10681,10685,10689,10693,10697,10701,10705,10709,
+10713,10717,10721,10725,10729,10733,10737,10741,10745,10749,10753,10757,10761,
+10765,10769,10773,10777,10781,10785,10789,10793,10797,10800,10804,10808,10812,
+10816,10820,10824,10828,10832,10836,10840,10844,10848,10852,10856,10860,10864,
+10867,10871,10875,10879,10883,10887,10891,10895,10899,10903,10907,10911,10914,
+10918,10922,10926,10930,10934,10938,10942,10946,10950,10953,10957,10961,10965,
+10969,10973,10977,10981,10985,10988,10992,10996,11000,11004,11008,11012,11016,
+11019,11023,11027,11031,11035,11039,11043,11046,11050,11054,11058,11062,11066,
+11070,11073,11077,11081,11085,11089,11093,11097,11100,11104,11108,11112,11116,
+11120,11123,11127,11131,11135,11139,11143,11146,11150,11154,11158,11162,11165,
+11169,11173,11177,11181,11184,11188,11192,11196,11200,11204,11207,11211,11215,
+11219,11223,11226,11230,11234,11238,11241,11245,11249,11253,11257,11260,11264,
+11268,11272,11276,11279,11283,11287,11291,11294,11298,11302,11306,11309,11313,
+11317,11321,11324,11328,11332,11336,11339,11343,11347,11351,11354,11358,11362,
+11366,11369,11373,11377,11381,11384,11388,11392,11396,11399,11403,11407,11411,
+11414,11418,11422,11425,11429,11433,11437,11440,11444,11448,11452,11455,11459,
+11463,11466,11470,11474,11477,11481,11485,11489,11492,11496,11500,11503,11507,
+11511,11514,11518,11522,11526,11529,11533,11537,11540,11544,11548,11551,11555,
+11559,11562,11566,11570,11573,11577,11581,11584,11588,11592,11595,11599,11603,
+11606,11610,11614,11617,11621,11625,11628,11632,11636,11639,11643,11647,11650,
+11654,11658,11661,11665,11668,11672,11676,11679,11683,11687,11690,11694,11698,
+11701,11705,11708,11712,11716,11719,11723,11727,11730,11734,11737,11741,11745,
+11748,11752,11755,11759,11763,11766,11770,11774,11777,11781,11784,11788,11792,
+11795,11799,11802,11806,11810,11813,11817,11820,11824,11827,11831,11835,11838,
+11842,11845,11849,11853,11856,11860,11863,11867,11870,11874,11878,11881,11885,
+11888,11892,11895,11899,11903,11906,11910,11913,11917,11920,11924,11927,11931,
+11935,11938,11942,11945,11949,11952,11956,11959,11963,11967,11970,11974,11977,
+11981,11984,11988,11991,11995,11998,12002,12005,12009,12012,12016,12020,12023,
+12027,12030,12034,12037,12041,12044,12048,12051,12055,12058,12062,12065,12069,
+12072,12076,12079,12083,12086,12090,12093,12097,12100,12104,12107,12111,12114,
+12118,12121,12125,12128,12132,12135,12139,12142,12146,12149,12153,12156,12160,
+12163,12167,12170,12174,12177,12181,12184,12188,12191,12195,12198,12201,12205,
+12208,12212,12215,12219,12222,12226,12229,12233,12236,12240,12243,12246,12250,
+12253,12257,12260,12264,12267,12271,12274,12278,12281,12284,12288,12291,12295,
+12298,12302,12305,12309,12312,12315,12319,12322,12326,12329,12333,12336,12339,
+12343,12346,12350,12353,12357,12360,12363,12367,12370,12374,12377,12380,12384,
+12387,12391,12394,12398,12401,12404,12408,12411,12415,12418,12421,12425,12428,
+12432,12435,12438,12442,12445,12449,12452,12455,12459,12462,12466,12469,12472,
+12476,12479,12482,12486,12489,12493,12496,12499,12503,12506,12510,12513,12516,
+12520,12523,12526,12530,12533,12537,12540,12543,12547,12550,12553,12557,12560,
+12563,12567,12570,12574,12577,12580,12584,12587,12590,12594,12597,12600,12604,
+12607,12610,12614,12617,12620,12624,12627,12630,12634,12637,12640,12644,12647,
+12651,12654,12657,12661,12664,12667,12671,12674,12677,12680,12684,12687,12690,
+12694,12697,12700,12704,12707,12710,12714,12717,12720,12724,12727,12730,12734,
+12737,12740,12744,12747,12750,12753,12757,12760,12763,12767,12770,12773,12777,
+12780,12783,12787,12790,12793,12796,12800,12803,12806,12810,12813,12816,12819,
+12823,12826,12829,12833,12836,12839,12842,12846,12849,12852,12856,12859,12862,
+12865,12869,12872,12875,12878,12882,12885,12888,12892,12895,12898,12901,12905,
+12908,12911,12914,12918,12921,12924,12927,12931,12934,12937,12940,12944,12947,
+12950,12953,12957,12960,12963,12966,12970,12973,12976,12979,12983,12986,12989,
+12992,12996,12999,13002,13005,13009,13012,13015,13018,13022,13025,13028,13031,
+13034,13038,13041,13044,13047,13051,13054,13057,13060,13064,13067,13070,13073,
+13076,13080,13083,13086,13089,13092,13096,13099,13102,13105,13109,13112,13115,
+13118,13121,13125,13128,13131,13134,13137,13141,13144,13147,13150,13153,13157,
+13160,13163,13166,13169,13173,13176,13179,13182,13185,13188,13192,13195,13198,
+13201,13204,13208,13211,13214,13217,13220,13224,13227,13230,13233,13236,13239,
+13243,13246,13249,13252,13255,13258,13262,13265,13268,13271,13274,13277,13281,
+13284,13287,13290,13293,13296,13300,13303,13306,13309,13312,13315,13318,13322,
+13325,13328,13331,13334,13337,13341,13344,13347,13350,13353,13356,13359,13363,
+13366,13369,13372,13375,13378,13381,13385,13388,13391,13394,13397,13400,13403,
+13406,13410,13413,13416,13419,13422,13425,13428,13431,13435,13438,13441,13444,
+13447,13450,13453,13456,13460,13463,13466,13469,13472,13475,13478,13481,13484,
+13488,13491,13494,13497,13500,13503,13506,13509,13512,13516,13519,13522,13525,
+13528,13531,13534,13537,13540,13543,13547,13550,13553,13556,13559,13562,13565,
+13568,13571,13574,13577,13581,13584,13587,13590,13593,13596,13599,13602,13605,
+13608,13611,13614,13618,13621,13624,13627,13630,13633,13636,13639,13642,13645,
+13648,13651,13654,13657,13661,13664,13667,13670,13673,13676,13679,13682,13685,
+13688,13691,13694,13697,13700,13703,13706,13709,13713,13716,13719,13722,13725,
+13728,13731,13734,13737,13740,13743,13746,13749,13752,13755,13758,13761,13764,
+13767,13770,13773,13776,13780,13783,13786,13789,13792,13795,13798,13801,13804,
+13807,13810,13813,13816,13819,13822,13825,13828,13831,13834,13837,13840,13843,
+13846,13849,13852,13855,13858,13861,13864,13867,13870,13873,13876,13879,13882,
+13885,13888,13891,13894,13897,13900,13903,13906,13909,13912,13915,13918,13921,
+13924,13927,13930,13933,13936,13939,13942,13945,13948,13951,13954,13957,13960,
+13963,13966,13969,13972,13975,13978,13981,13984,13987,13990,13993,13996,13999,
+14002,14005,14008,14011,14014,14017,14020,14023,14026,14029,14032,14035,14038,
+14041,14044,14047,14050,14053,14056,14059,14062,14065,14068,14071,14074,14077,
+14080,14083,14086,14088,14091,14094,14097,14100,14103,14106,14109,14112,14115,
+14118,14121,14124,14127,14130,14133,14136,14139,14142,14145,14148,14151,14154,
+14156,14159,14162,14165,14168,14171,14174,14177,14180,14183,14186,14189,14192,
+14195,14198,14201,14204,14206,14209,14212,14215,14218,14221,14224,14227,14230,
+14233,14236,14239,14242,14245,14247,14250,14253,14256,14259,14262,14265,14268,
+14271,14274,14277,14280,14283,14285,14288,14291,14294,14297,14300,14303,14306,
+14309,14312,14315,14318,14320,14323,14326,14329,14332,14335,14338,14341,14344,
+14347,14350,14352,14355,14358,14361,14364,14367,14370,14373,14376,14379,14381,
+14384,14387,14390,14393,14396,14399,14402,14405,14407,14410,14413,14416,14419,
+14422,14425,14428,14431,14433,14436,14439,14442,14445,14448,14451,14454,14456,
+14459,14462,14465,14468,14471,14474,14477,14479,14482,14485,14488,14491,14494,
+14497,14500,14502,14505,14508,14511,14514,14517,14520,14523,14525,14528,14531,
+14534,14537,14540,14543,14545,14548,14551,14554,14557,14560,14563,14565,14568,
+14571,14574,14577,14580,14583,14585,14588,14591,14594,14597,14600,14602,14605,
+14608,14611,14614,14617,14620,14622,14625,14628,14631,14634,14637,14639,14642,
+14645,14648,14651,14654,14656,14659,14662,14665,14668,14671,14673,14676,14679,
+14682,14685,14688,14690,14693,14696,14699,14702,14705,14707,14710,14713,14716,
+14719,14721,14724,14727,14730,14733,14736,14738,14741,14744,14747,14750,14752,
+14755,14758,14761,14764,14767,14769,14772,14775,14778,14781,14783,14786,14789,
+14792,14795,14797,14800,14803,14806,14809,14811,14814,14817,14820,14823,14825,
+14828,14831,14834,14837,14839,14842,14845,14848,14851,14853,14856,14859,14862,
+14865,14867,14870,14873,14876,14878,14881,14884,14887,14890,14892,14895,14898,
+14901,14904,14906,14909,14912,14915,14917,14920,14923,14926,14929,14931,14934,
+14937,14940,14942,14945,14948,14951,14954,14956,14959,14962,14965,14967,14970,
+14973,14976,14978,14981,14984,14987,14990,14992,14995,14998,15001,15003,15006,
+15009,15012,15014,15017,15020,15023,15025,15028,15031,15034,15036,15039,15042,
+15045,15047,15050,15053,15056,15058,15061,15064,15067,15069,15072,15075,15078,
+15080,15083,15086,15089,15091,15094,15097,15100,15102,15105,15108,15111,15113,
+15116,15119,15122,15124,15127,15130,15132,15135,15138,15141,15143,15146,15149,
+15152,15154,15157,15160,15163,15165,15168,15171,15173,15176,15179,15182,15184,
+15187,15190,15192,15195,15198,15201,15203,15206,15209,15212,15214,15217,15220,
+15222,15225,15228,15231,15233,15236,15239,15241,15244,15247,15250,15252,15255,
+15258,15260,15263,15266,15269,15271,15274,15277,15279,15282,15285,15287,15290,
+15293,15296,15298,15301,15304,15306,15309,15312,15314,15317,15320,15323,15325,
+15328,15331,15333,15336,15339,15341,15344,15347,15349,15352,15355,15358,15360,
+15363,15366,15368,15371,15374,15376,15379,15382,15384,15387,15390,15392,15395,
+15398,15401,15403,15406,15409,15411,15414,15417,15419,15422,15425,15427,15430,
+15433,15435,15438,15441,15443,15446,15449,15451,15454,15457,15459,15462,15465,
+15467,15470,15473,15475,15478,15481,15483,15486,15489,15491,15494,15497,15499,
+15502,15505,15507,15510,15513,15515,15518,15521,15523,15526,15529,15531,15534,
+15537,15539,15542,15544,15547,15550,15552,15555,15558,15560,15563,15566,15568,
+15571,15574,15576,15579,15582,15584,15587,15590,15592,15595,15597,15600,15603,
+15605,15608,15611,15613,15616,15619,15621,15624,15626,15629,15632,15634,15637,
+15640,15642,15645,15648,15650,15653,15655,15658,15661,15663,15666,15669,15671,
+15674,15676,15679,15682,15684,15687,15690,15692,15695,15697,15700,15703,15705,
+15708,15711,15713,15716,15718,15721,15724,15726,15729,15732,15734,15737,15739,
+15742,15745,15747,15750,15752,15755,15758,15760,15763,15766,15768,15771,15773,
+15776,15779,15781,15784,15786,15789,15792,15794,15797,15799,15802,15805,15807,
+15810,15812,15815,15818,15820,15823,15825,15828,15831,15833,15836,15838,15841,
+15844,15846,15849,15851,15854,15857,15859,15862,15864,15867,15870,15872,15875,
+15877,15880,15882,15885,15888,15890,15893,15895,15898,15901,15903,15906,15908,
+15911,15914,15916,15919,15921,15924,15926,15929,15932,15934,15937,15939,15942,
+15944,15947,15950,15952,15955,15957,15960,15962,15965,15968,15970,15973,15975,
+15978,15980,15983,15986,15988,15991,15993,15996,15998,16001,16004,16006,16009,
+16011,16014,16016,16019,16022,16024,16027,16029,16032,16034,16037,16039,16042,
+16045,16047,16050,16052,16055,16057,16060,16063,16065,16068,16070,16073,16075,
+16078,16080,16083,16085,16088,16091,16093,16096,16098,16101,16103,16106,16108,
+16111,16114,16116,16119,16121,16124,16126,16129,16131,16134,16136,16139,16141,
+16144,16147,16149,16152,16154,16157,16159,16162,16164,16167,16169,16172,16174,
+16177,16180,16182,16185,16187,16190,16192,16195,16197,16200,16202,16205,16207,
+16210,16212,16215,16218,16220,16223,16225,16228,16230,16233,16235,16238,16240,
+16243,16245,16248,16250,16253,16255,16258,16260,16263,16265,16268,16270,16273,
+16276,16278,16281,16283,16286,16288,16291,16293,16296,16298,16301,16303,16306,
+16308,16311,16313,16316,16318,16321,16323,16326,16328,16331,16333,16336,16338,
+16341,16343,16346,16348,16351,16353,16356,16358,16361,16363,16366,16368,16371,
+16373,16376,16378,16381,16383,16386,16388,16391,16393,16396,16398,16401,16403,
+16406,16408,16411,16413,16416,16418,16421,16423,16426,16428,16431,16433,16436,
+16438,16441,16443,16446,16448,16451,16453,16456,16458,16461,16463,16466,16468,
+16471,16473,16475,16478,16480,16483,16485,16488,16490,16493,16495,16498,16500,
+16503,16505,16508,16510,16513,16515,16518,16520,16523,16525,16527,16530,16532,
+16535,16537,16540,16542,16545,16547,16550,16552,16555,16557,16560,16562,16565,
+16567,16569,16572,16574,16577,16579,16582,16584,16587,16589,16592,16594,16597,
+16599,16601,16604,16606,16609,16611,16614,16616,16619,16621,16624,16626,16629,
+16631,16633,16636,16638,16641,16643,16646,16648,16651,16653,16656,16658,16660,
+16663,16665,16668,16670,16673,16675,16678,16680,16682,16685,16687,16690,16692,
+16695,16697,16700,16702,16704,16707,16709,16712,16714,16717,16719,16722,16724,
+16726,16729,16731,16734,16736,16739,16741,16743,16746,16748,16751,16753,16756,
+16758,16761,16763,16765,16768,16770,16773,16775,16778,16780,16782,16785,16787,
+16790,16792,16795,16797,16799,16802,16804,16807,16809,16812,16814,16816,16819,
+16821,16824,16826,16829,16831,16833,16836,16838,16841,16843,16845,16848,16850,
+16853,16855,16858,16860,16862,16865,16867,16870,16872,16874,16877,16879,16882,
+16884,16887,16889,16891,16894,16896,16899,16901,16903,16906,16908,16911,16913,
+16915,16918,16920,16923,16925,16927,16930,16932,16935,16937,16940,16942,16944,
+16947,16949,16952,16954,16956,16959,16961,16964,16966,16968,16971,16973,16976,
+16978,16980,16983,16985,16988,16990,16992,16995,16997,16999,17002,17004,17007,
+17009,17011,17014,17016,17019,17021,17023,17026,17028,17031,17033,17035,17038,
+17040,17043,17045,17047,17050,17052,17054,17057,17059,17062,17064,17066,17069,
+17071,17074,17076,17078,17081,17083,17085,17088,17090,17093,17095,17097,17100,
+17102,17104,17107,17109,17112,17114,17116,17119,17121,17123,17126,17128,17131,
+17133,17135,17138,17140,17142,17145,17147,17150,17152,17154,17157,17159,17161,
+17164,17166,17168,17171,17173,17176,17178,17180,17183,17185,17187,17190,17192,
+17194,17197,17199,17202,17204,17206,17209,17211,17213,17216,17218,17220,17223,
+17225,17228,17230,17232,17235,17237,17239,17242,17244,17246,17249,17251,17253,
+17256,17258,17260,17263,17265,17268,17270,17272,17275,17277,17279,17282,17284,
+17286,17289,17291,17293,17296,17298,17300,17303,17305,17307,17310,17312,17315,
+17317,17319,17322,17324,17326,17329,17331,17333,17336,17338,17340,17343,17345,
+17347,17350,17352,17354,17357,17359,17361,17364,17366,17368,17371,17373,17375,
+17378,17380,17382,17385,17387,17389,17392,17394,17396,17399,17401,17403,17406,
+17408,17410,17413,17415,17417,17420,17422,17424,17427,17429,17431,17434,17436,
+17438,17441,17443,17445,17448,17450,17452,17454,17457,17459,17461,17464,17466,
+17468,17471,17473,17475,17478,17480,17482,17485,17487,17489,17492,17494,17496,
+17499,17501,17503,17505,17508,17510,17512,17515,17517,17519,17522,17524,17526,
+17529,17531,17533,17536,17538,17540,17542,17545,17547,17549,17552,17554,17556,
+17559,17561,17563,17566,17568,17570,17572,17575,17577,17579,17582,17584,17586,
+17589,17591,17593,17595,17598,17600,17602,17605,17607,17609,17612,17614,17616,
+17618,17621,17623,17625,17628,17630,17632,17635,17637,17639,17641,17644,17646,
+17648,17651,17653,17655,17657,17660,17662,17664,17667,17669,17671,17673,17676,
+17678,17680,17683,17685,17687,17689,17692,17694,17696,17699,17701,17703,17705,
+17708,17710,17712,17715,17717,17719,17721,17724,17726,17728,17731,17733,17735,
+17737,17740,17742,17744,17747,17749,17751,17753,17756,17758,17760,17762,17765,
+17767,17769,17772,17774,17776,17778,17781,17783,17785,17787,17790,17792,17794,
+17797,17799,17801,17803,17806,17808,17810,17812,17815,17817,17819,17821,17824,
+17826,17828,17831,17833,17835,17837,17840,17842,17844,17846,17849,17851,17853,
+17855,17858,17860,17862,17864,17867,17869,17871,17874,17876,17878,17880,17883,
+17885,17887,17889,17892,17894,17896,17898,17901,17903,17905,17907,17910,17912,
+17914,17916,17919,17921,17923,17925,17928,17930,17932,17934,17937,17939,17941,
+17943,17946,17948,17950,17952,17955,17957,17959,17961,17964,17966,17968,17970,
+17973,17975,17977,17979,17982,17984,17986,17988,17991,17993,17995,17997,18000,
+18002,18004,18006,18008,18011,18013,18015,18017,18020,18022,18024,18026,18029,
+18031,18033,18035,18038,18040,18042,18044,18046,18049,18051,18053,18055,18058,
+18060,18062,18064,18067,18069,18071,18073,18075,18078,18080,18082,18084,18087,
+18089,18091,18093,18096,18098,18100,18102,18104,18107,18109,18111,18113,18116,
+18118,18120,18122,18124,18127,18129,18131,18133,18136,18138,18140,18142,18144,
+18147,18149,18151,18153,18156,18158,18160,18162,18164,18167,18169,18171,18173,
+18175,18178,18180,18182,18184,18187,18189,18191,18193,18195,18198,18200,18202,
+18204,18206,18209,18211,18213,18215,18218,18220,18222,18224,18226,18229,18231,
+18233,18235,18237,18240,18242,18244,18246,18248,18251,18253,18255,18257,18259,
+18262,18264,18266,18268,18270,18273,18275,18277,18279,18281,18284,18286,18288,
+18290,18292,18295,18297,18299,18301,18303,18306,18308,18310,18312,18314,18317,
+18319,18321,18323,18325,18328,18330,18332,18334,18336,18339,18341,18343,18345,
+18347,18349,18352,18354,18356,18358,18360,18363,18365,18367,18369,18371,18374,
+18376,18378,18380,18382,18385,18387,18389,18391,18393,18395,18398,18400,18402,
+18404,18406,18409,18411,18413,18415,18417,18419,18422,18424,18426,18428,18430,
+18433,18435,18437,18439,18441,18443,18446,18448,18450,18452,18454,18456,18459,
+18461,18463,18465,18467,18470,18472,18474,18476,18478,18480,18483,18485,18487,
+18489,18491,18493,18496,18498,18500,18502,18504,18506,18509,18511,18513,18515,
+18517,18519,18522,18524,18526,18528,18530,18532,18535,18537,18539,18541,18543,
+18545,18548,18550,18552,18554,18556,18558,18561,18563,18565,18567,18569,18571,
+18574,18576,18578,18580,18582,18584,18586,18589,18591,18593,18595,18597,18599,
+18602,18604,18606,18608,18610,18612,18614,18617,18619,18621,18623,18625,18627,
+18630,18632,18634,18636,18638,18640,18642,18645,18647,18649,18651,18653,18655,
+18658,18660,18662,18664,18666,18668,18670,18673,18675,18677,18679,18681,18683,
+18685,18688,18690,18692,18694,18696,18698,18700,18703,18705,18707,18709,18711,
+18713,18715,18718,18720,18722,18724,18726,18728,18730,18733,18735,18737,18739,
+18741,18743,18745,18747,18750,18752,18754,18756,18758,18760,18762,18765,18767,
+18769,18771,18773,18775,18777,18779,18782,18784,18786,18788,18790,18792,18794,
+18797,18799,18801,18803,18805,18807,18809,18811,18814,18816,18818,18820,18822,
+18824,18826,18828,18831,18833,18835,18837,18839,18841,18843,18845,18848,18850,
+18852,18854,18856,18858,18860,18862,18865,18867,18869,18871,18873,18875,18877,
+18879,18881,18884,18886,18888,18890,18892,18894,18896,18898,18901,18903,18905,
+18907,18909,18911,18913,18915,18917,18920,18922,18924,18926,18928,18930,18932,
+18934,18936,18939,18941,18943,18945,18947,18949,18951,18953,18955,18958,18960,
+18962,18964,18966,18968,18970,18972,18974,18977,18979,18981,18983,18985,18987,
+18989,18991,18993,18995,18998,19000,19002,19004,19006,19008,19010,19012,19014,
+19016,19019,19021,19023,19025,19027,19029,19031,19033,19035,19037,19040,19042,
+19044,19046,19048,19050,19052,19054,19056,19058,19061,19063,19065,19067,19069,
+19071,19073,19075,19077,19079,19081,19084,19086,19088,19090,19092,19094,19096,
+19098,19100,19102,19104,19107,19109,19111,19113,19115,19117,19119,19121,19123,
+19125,19127,19130,19132,19134,19136,19138,19140,19142,19144,19146,19148,19150,
+19152,19155,19157,19159,19161,19163,19165,19167,19169,19171,19173,19175,19177,
+19180,19182,19184,19186,19188,19190,19192,19194,19196,19198,19200,19202,19204,
+19207,19209,19211,19213,19215,19217,19219,19221,19223,19225,19227,19229,19231,
+19233,19236,19238,19240,19242,19244,19246,19248,19250,19252,19254,19256,19258,
+19260,19262,19265,19267,19269,19271,19273,19275,19277,19279,19281,19283,19285,
+19287,19289,19291,19293,19296,19298,19300,19302,19304,19306,19308,19310,19312,
+19314,19316,19318,19320,19322,19324,19327,19329,19331,19333,19335,19337,19339,
+19341,19343,19345,19347,19349,19351,19353,19355,19357,19359,19362,19364,19366,
+19368,19370,19372,19374,19376,19378,19380,19382,19384,19386,19388,19390,19392,
+19394,19396,19398,19401,19403,19405,19407,19409,19411,19413,19415,19417,19419,
+19421,19423,19425,19427,19429,19431,19433,19435,19437,19439,19442,19444,19446,
+19448,19450,19452,19454,19456,19458,19460,19462,19464,19466,19468,19470,19472,
+19474,19476,19478,19480,19482,19484,19486,19489,19491,19493,19495,19497,19499,
+19501,19503,19505,19507,19509,19511,19513,19515,19517,19519,19521,19523,19525,
+19527,19529,19531,19533,19535,19537,19539,19541,19544,19546,19548,19550,19552,
+19554,19556,19558,19560,19562,19564,19566,19568,19570,19572,19574,19576,19578,
+19580,19582,19584,19586,19588,19590,19592,19594,19596,19598,19600,19602,19604,
+19606,19608,19611,19613,19615,19617,19619,19621,19623,19625,19627,19629,19631,
+19633,19635,19637,19639,19641,19643,19645,19647,19649,19651,19653,19655,19657,
+19659,19661,19663,19665,19667,19669,19671,19673,19675,19677,19679,19681,19683,
+19685,19687,19689,19691,19693,19695,19697,19699,19701,19703,19705,19707,19709,
+19711,19714,19716,19718,19720,19722,19724,19726,19728,19730,19732,19734,19736,
+19738,19740,19742,19744,19746,19748,19750,19752,19754,19756,19758,19760,19762,
+19764,19766,19768,19770,19772,19774,19776,19778,19780,19782,19784,19786,19788,
+19790,19792,19794,19796,19798,19800,19802,19804,19806,19808,19810,19812,19814,
+19816,19818,19820,19822,19824,19826,19828,19830,19832,19834,19836,19838,19840,
+19842,19844,19846,19848,19850,19852,19854,19856,19858,19860,19862,19864,19866,
+19868,19870,19872,19874,19876,19878,19880,19882,19884,19886,19888,19890,19892,
+19894,19896,19898,19900,19902,19904,19906,19908,19910,19912,19914,19916,19918,
+19920,19922,19924,19926,19928,19930,19932,19934,19935,19937,19939,19941,19943,
+19945,19947,19949,19951,19953,19955,19957,19959,19961,19963,19965,19967,19969,
+19971,19973,19975,19977,19979,19981,19983,19985,19987,19989,19991,19993,19995,
+19997,19999,20001,20003,20005,20007,20009,20011,20013,20015,20017,20019,20021,
+20023,20025,20027,20029,20031,20033,20035,20037,20038,20040,20042,20044,20046,
+20048,20050,20052,20054,20056,20058,20060,20062,20064,20066,20068,20070,20072,
+20074,20076,20078,20080,20082,20084,20086,20088,20090,20092,20094,20096,20098,
+20100,20102,20104,20105,20107,20109,20111,20113,20115,20117,20119,20121,20123,
+20125,20127,20129,20131,20133,20135,20137,20139,20141,20143,20145,20147,20149,
+20151,20153,20155,20157,20159,20160,20162,20164,20166,20168,20170,20172,20174,
+20176,20178,20180,20182,20184,20186,20188,20190,20192,20194,20196,20198,20200,
+20202,20204,20205,20207,20209,20211,20213,20215,20217,20219,20221,20223,20225,
+20227,20229,20231,20233,20235,20237,20239,20241,20243,20245,20247,20248,20250,
+20252,20254,20256,20258,20260,20262,20264,20266,20268,20270,20272,20274,20276,
+20278,20280,20282,20284,20285,20287,20289,20291,20293,20295,20297,20299,20301,
+20303,20305,20307,20309,20311,20313,20315,20317,20319,20320,20322,20324,20326,
+20328,20330,20332,20334,20336,20338,20340,20342,20344,20346,20348,20350,20352,
+20353,20355,20357,20359,20361,20363,20365,20367,20369,20371,20373,20375,20377,
+20379,20381,20382,20384,20386,20388,20390,20392,20394,20396,20398,20400,20402,
+20404,20406,20408,20410,20411,20413,20415,20417,20419,20421,20423,20425,20427,
+20429,20431,20433,20435,20437,20439,20440,20442,20444,20446,20448,20450,20452,
+20454,20456,20458,20460,20462,20464,20466,20467,20469,20471,20473,20475,20477,
+20479,20481,20483,20485,20487,20489,20491,20492,20494,20496,20498,20500,20502,
+20504,20506,20508,20510,20512,20514,20515,20517,20519,20521,20523,20525,20527,
+20529,20531,20533,20535,20537,20539,20540,20542,20544,20546,20548,20550,20552,
+20554,20556,20558,20560,20562,20563,20565,20567,20569,20571,20573,20575,20577,
+20579,20581,20583,20584,20586,20588,20590,20592,20594,20596,20598,20600,20602,
+20604,20606,20607,20609,20611,20613,20615,20617,20619,20621,20623,20625,20627,
+20628,20630,20632,20634,20636,20638,20640,20642,20644,20646,20647,20649,20651,
+20653,20655,20657,20659,20661,20663,20665,20667,20668,20670,20672,20674,20676,
+20678,20680,20682,20684,20686,20687,20689,20691,20693,20695,20697,20699,20701,
+20703,20705,20706,20708,20710,20712,20714,20716,20718,20720,20722,20724,20725,
+20727,20729,20731,20733,20735,20737,20739,20741,20742,20744,20746,20748,20750,
+20752,20754,20756,20758,20760,20761,20763,20765,20767,20769,20771,20773,20775,
+20777,20778,20780,20782,20784,20786,20788,20790,20792,20794,20795,20797,20799,
+20801,20803,20805,20807,20809,20811,20812,20814,20816,20818,20820,20822,20824,
+20826,20828,20829,20831,20833,20835,20837,20839,20841,20843,20845,20846,20848,
+20850,20852,20854,20856,20858,20860,20861,20863,20865,20867,20869,20871,20873,
+20875,20877,20878,20880,20882,20884,20886,20888,20890,20892,20893,20895,20897,
+20899,20901,20903,20905,20907,20908,20910,20912,20914,20916,20918,20920,20922,
+20923,20925,20927,20929,20931,20933,20935,20937,20938,20940,20942,20944,20946,
+20948,20950,20952,20953,20955,20957,20959,20961,20963,20965,20967,20968,20970,
+20972,20974,20976,20978,20980,20982,20983,20985,20987,20989,20991,20993,20995,
+20996,20998,21000,21002,21004,21006,21008,21010,21011,21013,21015,21017,21019,
+21021,21023,21024,21026,21028,21030,21032,21034,21036,21038,21039,21041,21043,
+21045,21047,21049,21051,21052,21054,21056,21058,21060,21062,21064,21065,21067,
+21069,21071,21073,21075,21077,21078,21080,21082,21084,21086,21088,21090,21091,
+21093,21095,21097,21099,21101,21103,21104,21106,21108,21110,21112,21114,21116,
+21117,21119,21121,21123,21125,21127,21129,21130,21132,21134,21136,21138,21140,
+21142,21143,21145,21147,21149,21151,21153,21155,21156,21158,21160,21162,21164,
+21166,21167,21169,21171,21173,21175,21177,21179,21180,21182,21184,21186,21188,
+21190,21192,21193,21195,21197,21199,21201,21203,21204,21206,21208,21210,21212,
+21214,21216,21217,21219,21221,21223,21225,21227,21228,21230,21232,21234,21236,
+21238,21239,21241,21243,21245,21247,21249,21251,21252,21254,21256,21258,21260,
+21262,21263,21265,21267,21269,21271,21273,21274,21276,21278,21280,21282,21284,
+21285,21287,21289,21291,21293,21295,21296,21298,21300,21302,21304,21306,21308,
+21309,21311,21313,21315,21317,21319,21320,21322,21324,21326,21328,21330,21331,
+21333,21335,21337,21339,21341,21342,21344,21346,21348,21350,21351,21353,21355,
+21357,21359,21361,21362,21364,21366,21368,21370,21372,21373,21375,21377,21379,
+21381,21383,21384,21386,21388,21390,21392,21394,21395,21397,21399,21401,21403,
+21405,21406,21408,21410,21412,21414,21415,21417,21419,21421,21423,21425,21426,
+21428,21430,21432,21434,21436,21437,21439,21441,21443,21445,21446,21448,21450,
+21452,21454,21456,21457,21459,21461,21463,21465,21466,21468,21470,21472,21474,
+21476,21477,21479,21481,21483,21485,21486,21488,21490,21492,21494,21496,21497,
+21499,21501,21503,21505,21506,21508,21510,21512,21514,21516,21517,21519,21521,
+21523,21525,21526,21528,21530,21532,21534,21535,21537,21539,21541,21543,21545,
+21546,21548,21550,21552,21554,21555,21557,21559,21561,21563,21564,21566,21568,
+21570,21572,21573,21575,21577,21579,21581,21582,21584,21586,21588,21590,21592,
+21593,21595,21597,21599,21601,21602,21604,21606,21608,21610,21611,21613,21615,
+21617,21619,21620,21622,21624,21626,21628,21629,21631,21633,21635,21637,21638,
+21640,21642,21644,21646,21647,21649,21651,21653,21655,21656,21658,21660,21662,
+21664,21665,21667,21669,21671,21673,21674,21676,21678,21680,21682,21683,21685,
+21687,21689,21691,21692,21694,21696,21698,21700,21701,21703,21705,21707,21709,
+21710,21712,21714,21716,21718,21719,21721,21723,21725,21726,21728,21730,21732,
+21734,21735,21737,21739,21741,21743,21744,21746,21748,21750,21752,21753,21755,
+21757,21759,21761,21762,21764,21766,21768,21769,21771,21773,21775,21777,21778,
+21780,21782,21784,21786,21787,21789,21791,21793,21794,21796,21798,21800,21802,
+21803,21805,21807,21809,21811,21812,21814,21816,21818,21819,21821,21823,21825,
+21827,21828,21830,21832,21834,21836,21837,21839,21841,21843,21844,21846,21848,
+21850,21852,21853,21855,21857,21859,21860,21862,21864,21866,21868,21869,21871,
+21873,21875,21876,21878,21880,21882,21884,21885,21887,21889,21891,21892,21894,
+21896,21898,21900,21901,21903,21905,21907,21908,21910,21912,21914,21916,21917,
+21919,21921,21923,21924,21926,21928,21930,21932,21933,21935,21937,21939,21940,
+21942,21944,21946,21947,21949,21951,21953,21955,21956,21958,21960,21962,21963,
+21965,21967,21969,21970,21972,21974,21976,21978,21979,21981,21983,21985,21986,
+21988,21990,21992,21993,21995,21997,21999,22001,22002,22004,22006,22008,22009,
+22011,22013,22015,22016,22018,22020,22022,22023,22025,22027,22029,22031,22032,
+22034,22036,22038,22039,22041,22043,22045,22046,22048,22050,22052,22053,22055,
+22057,22059,22060,22062,22064,22066,22068,22069,22071,22073,22075,22076,22078,
+22080,22082,22083,22085,22087,22089,22090,22092,22094,22096,22097,22099,22101,
+22103,22104,22106,22108,22110,22111,22113,22115,22117,22118,22120,22122,22124,
+22125,22127,22129,22131,22132,22134,22136,22138,22140,22141,22143,22145,22147,
+22148,22150,22152,22154,22155,22157,22159,22161,22162,22164,22166,22168,22169,
+22171,22173,22175,22176,22178,22180,22182,22183,22185,22187,22189,22190,22192,
+22194,22196,22197,22199,22201,22203,22204,22206,22208,22209,22211,22213,22215,
+22216,22218,22220,22222,22223,22225,22227,22229,22230,22232,22234,22236,22237,
+22239,22241,22243,22244,22246,22248,22250,22251,22253,22255,22257,22258,22260,
+22262,22264,22265,22267,22269,22270,22272,22274,22276,22277,22279,22281,22283,
+22284,22286,22288,22290,22291,22293,22295,22297,22298,22300,22302,22304,22305,
+22307,22309,22310,22312,22314,22316,22317,22319,22321,22323,22324,22326,22328,
+22330,22331,22333,22335,22337,22338,22340,22342,22343,22345,22347,22349,22350,
+22352,22354,22356,22357,22359,22361,22363,22364,22366,22368,22369,22371,22373,
+22375,22376,22378,22380,22382,22383,22385,22387,22388,22390,22392,22394,22395,
+22397,22399,22401,22402,22404,22406,22407,22409,22411,22413,22414,22416,22418,
+22420,22421,22423,22425,22426,22428,22430,22432,22433,22435,22437,22439,22440,
+22442,22444,22445,22447,22449,22451,22452,22454,22456,22458,22459,22461,22463,
+22464,22466,22468,22470,22471,22473,22475,22476,22478,22480,22482,22483,22485,
+22487,22488,22490,22492,22494,22495,22497,22499,22501,22502,22504,22506,22507,
+22509,22511,22513,22514,22516,22518,22519,22521,22523,22525,22526,22528,22530,
+22531,22533,22535,22537,22538,22540,22542,22543,22545,22547,22549,22550,22552,
+22554,22555,22557,22559,22561,22562,22564,22566,22567,22569,22571,22573,22574,
+22576,22578,22579,22581,22583,22585,22586,22588,22590,22591,22593,22595,22597,
+22598,22600,22602,22603,22605,22607,22609,22610,22612,22614,22615,22617,22619,
+22620,22622,22624,22626,22627,22629,22631,22632,22634,22636,22638,22639,22641,
+22643,22644,22646,22648,22649,22651,22653,22655,22656,22658,22660,22661,22663,
+22665,22667,22668,22670,22672,22673,22675,22677,22678,22680,22682,22684,22685,
+22687,22689,22690,22692,22694,22695,22697,22699,22701,22702,22704,22706,22707,
+22709,22711,22712,22714,22716,22718,22719,22721,22723,22724,22726,22728,22729,
+22731,22733,22735,22736,22738,22740,22741,22743,22745,22746,22748,22750,22752,
+22753,22755,22757,22758,22760,22762,22763,22765,22767,22768,22770,22772,22774,
+22775,22777,22779,22780,22782,22784,22785,22787,22789,22790,22792,22794,22796,
+22797,22799,22801,22802,22804,22806,22807,22809,22811,22812,22814,22816,22818,
+22819,22821,22823,22824,22826,22828,22829,22831,22833,22834,22836,22838,22840,
+22841,22843,22845,22846,22848,22850,22851,22853,22855,22856,22858,22860,22861,
+22863,22865,22866,22868,22870,22872,22873,22875,22877,22878,22880,22882,22883,
+22885,22887,22888,22890,22892,22893,22895,22897,22898,22900,22902,22904,22905,
+22907,22909,22910,22912,22914,22915,22917,22919,22920,22922,22924,22925,22927,
+22929,22930,22932,22934,22935,22937,22939,22941,22942,22944,22946,22947,22949,
+22951,22952,22954,22956,22957,22959,22961,22962,22964,22966,22967,22969,22971,
+22972,22974,22976,22977,22979,22981,22982,22984,22986,22987,22989,22991,22992,
+22994,22996,22998,22999,23001,23003,23004,23006,23008,23009,23011,23013,23014,
+23016,23018,23019,23021,23023,23024,23026,23028,23029,23031,23033,23034,23036,
+23038,23039,23041,23043,23044,23046,23048,23049,23051,23053,23054,23056,23058,
+23059,23061,23063,23064,23066,23068,23069,23071,23073,23074,23076,23078,23079,
+23081,23083,23084,23086,23088,23089,23091,23093,23094,23096,23098,23099,23101,
+23103,23104,23106,23108,23109,23111,23113,23114,23116,23118,23119,23121,23123,
+23124,23126,23128,23129,23131,23133,23134,23136,23138,23139,23141,23143,23144,
+23146,23148,23149,23151,23153,23154,23156,23158,23159,23161,23163,23164,23166,
+23168,23169,23171,23172,23174,23176,23177,23179,23181,23182,23184,23186,23187,
+23189,23191,23192,23194,23196,23197,23199,23201,23202,23204,23206,23207,23209,
+23211,23212,23214,23216,23217,23219,23221,23222,23224,23226,23227,23229,23230,
+23232,23234,23235,23237,23239,23240,23242,23244,23245,23247,23249,23250,23252,
+23254,23255,23257,23259,23260,23262,23264,23265,23267,23268,23270,23272,23273,
+23275,23277,23278,23280,23282,23283,23285,23287,23288,23290,23292,23293,23295,
+23297,23298,23300,23301,23303,23305,23306,23308,23310,23311,23313,23315,23316,
+23318,23320,23321,23323,23324,23326,23328,23329,23331,23333,23334,23336,23338,
+23339,23341,23343,23344,23346,23348,23349,23351,23352,23354,23356,23357,23359,
+23361,23362,23364,23366,23367,23369,23371,23372,23374,23375,23377,23379,23380,
+23382,23384,23385,23387,23389,23390,23392,23393,23395,23397,23398,23400,23402,
+23403,23405,23407,23408,23410,23412,23413,23415,23416,23418,23420,23421,23423,
+23425,23426,23428,23430,23431,23433,23434,23436,23438,23439,23441,23443,23444,
+23446,23448,23449,23451,23452,23454,23456,23457,23459,23461,23462,23464,23466,
+23467,23469,23470,23472,23474,23475,23477,23479,23480,23482,23483,23485,23487,
+23488,23490,23492,23493,23495,23497,23498,23500,23501,23503,23505,23506,23508,
+23510,23511,23513,23514,23516,23518,23519,23521,23523,23524,23526,23527,23529,
+23531,23532,23534,23536,23537,23539,23541,23542,23544,23545,23547,23549,23550,
+23552,23554,23555,23557,23558,23560,23562,23563,23565,23567,23568,23570,23571,
+23573,23575,23576,23578,23580,23581,23583,23584,23586,23588,23589,23591,23593,
+23594,23596,23597,23599,23601,23602,23604,23606,23607,23609,23610,23612,23614,
+23615,23617,23618,23620,23622,23623,23625,23627,23628,23630,23631,23633,23635,
+23636,23638,23640,23641,23643,23644,23646,23648,23649,23651,23652,23654,23656,
+23657,23659,23661,23662,23664,23665,23667,23669,23670,23672,23674,23675,23677,
+23678,23680,23682,23683,23685,23686,23688,23690,23691,23693,23695,23696,23698,
+23699,23701,23703,23704,23706,23707,23709,23711,23712,23714,23715,23717,23719,
+23720,23722,23724,23725,23727,23728,23730,23732,23733,23735,23736,23738,23740,
+23741,23743,23744,23746,23748,23749,23751,23753,23754,23756,23757,23759,23761,
+23762,23764,23765,23767,23769,23770,23772,23773,23775,23777,23778,23780,23781,
+23783,23785,23786,23788,23790,23791,23793,23794,23796,23798,23799,23801,23802,
+23804,23806,23807,23809,23810,23812,23814,23815,23817,23818,23820,23822,23823,
+23825,23826,23828,23830,23831,23833,23834,23836,23838,23839,23841,23842,23844,
+23846,23847,23849,23850,23852,23854,23855,23857,23858,23860,23862,23863,23865,
+23867,23868,23870,23871,23873,23875,23876,23878,23879,23881,23882,23884,23886,
+23887,23889,23890,23892,23894,23895,23897,23898,23900,23902,23903,23905,23906,
+23908,23910,23911,23913,23914,23916,23918,23919,23921,23922,23924,23926,23927,
+23929,23930,23932,23934,23935,23937,23938,23940,23942,23943,23945,23946,23948,
+23950,23951,23953,23954,23956,23958,23959,23961,23962,23964,23965,23967,23969,
+23970,23972,23973,23975,23977,23978,23980,23981,23983,23985,23986,23988,23989,
+23991,23993,23994,23996,23997,23999,24000,24002,24004,24005,24007,24008,24010,
+24012,24013,24015,24016,24018,24020,24021,24023,24024,24026,24027,24029,24031,
+24032,24034,24035,24037,24039,24040,24042,24043,24045,24047,24048,24050,24051,
+24053,24054,24056,24058,24059,24061,24062,24064,24066,24067,24069,24070,24072,
+24073,24075,24077,24078,24080,24081,24083,24085,24086,24088,24089,24091,24092,
+24094,24096,24097,24099,24100,24102,24104,24105,24107,24108,24110,24111,24113,
+24115,24116,24118,24119,24121,24122,24124,24126,24127,24129,24130,24132,24134,
+24135,24137,24138,24140,24141,24143,24145,24146,24148,24149,24151,24152,24154,
+24156,24157,24159,24160,24162,24164,24165,24167,24168,24170,24171,24173,24175,
+24176,24178,24179,24181,24182,24184,24186,24187,24189,24190,24192,24193,24195,
+24197,24198,24200,24201,24203,24204,24206,24208,24209,24211,24212,24214,24215,
+24217,24219,24220,24222,24223,24225,24226,24228,24230,24231,24233,24234,24236,
+24237,24239,24241,24242,24244,24245,24247,24248,24250,24252,24253,24255,24256,
+24258,24259,24261,24263,24264,24266,24267,24269,24270,24272,24274,24275,24277,
+24278,24280,24281,24283,24285,24286,24288,24289,24291,24292,24294,24296,24297,
+24299,24300,24302,24303,24305,24306,24308,24310,24311,24313,24314,24316,24317,
+24319,24321,24322,24324,24325,24327,24328,24330,24332,24333,24335,24336,24338,
+24339,24341,24342,24344,24346,24347,24349,24350,24352,24353,24355,24356,24358,
+24360,24361,24363,24364,24366,24367,24369,24371,24372,24374,24375,24377,24378,
+24380,24381,24383,24385,24386,24388,24389,24391,24392,24394,24395,24397,24399,
+24400,24402,24403,24405,24406,24408,24410,24411,24413,24414,24416,24417,24419,
+24420,24422,24424,24425,24427,24428,24430,24431,24433,24434,24436,24438,24439,
+24441,24442,24444,24445,24447,24448,24450,24452,24453,24455,24456,24458,24459,
+24461,24462,24464,24465,24467,24469,24470,24472,24473,24475,24476,24478,24479,
+24481,24483,24484,24486,24487,24489,24490,24492,24493,24495,24497,24498,24500,
+24501,24503,24504,24506,24507,24509,24510,24512,24514,24515,24517,24518,24520,
+24521,24523,24524,24526,24528,24529,24531,24532,24534,24535,24537,24538,24540,
+24541,24543,24545,24546,24548,24549,24551,24552,24554,24555,24557,24558,24560,
+24562,24563,24565,24566,24568,24569,24571,24572,24574,24575,24577,24579,24580,
+24582,24583,24585,24586,24588,24589,24591,24592,24594,24596,24597,24599,24600,
+24602,24603,24605,24606,24608,24609,24611,24612,24614,24616,24617,24619,24620,
+24622,24623,24625,24626,24628,24629,24631,24633,24634,24636,24637,24639,24640,
+24642,24643,24645,24646,24648,24649,24651,24653,24654,24656,24657,24659,24660,
+24662,24663,24665,24666,24668,24669,24671,24673,24674,24676,24677,24679,24680,
+24682,24683,24685,24686,24688,24689,24691,24692,24694,24696,24697,24699,24700,
+24702,24703,24705,24706,24708,24709,24711,24712,24714,24715,24717,24719,24720,
+24722,24723,24725,24726,24728,24729,24731,24732,24734,24735,24737,24738,24740,
+24742,24743,24745,24746,24748,24749,24751,24752,24754,24755,24757,24758,24760,
+24761,24763,24765,24766,24768,24769,24771,24772,24774,24775,24777,24778,24780,
+24781,24783,24784,24786,24787,24789,24791,24792,24794,24795,24797,24798,24800,
+24801,24803,24804,24806,24807,24809,24810,24812,24813,24815,24816,24818,24820,
+24821,24823,24824,24826,24827,24829,24830,24832,24833,24835,24836,24838,24839,
+24841,24842,24844,24845,24847,24848,24850,24852,24853,24855,24856,24858,24859,
+24861,24862,24864,24865,24867,24868,24870,24871,24873,24874,24876,24877,24879,
+24880,24882,24883,24885,24887,24888,24890,24891,24893,24894,24896,24897,24899,
+24900,24902,24903,24905,24906,24908,24909,24911,24912,24914,24915,24917,24918,
+24920,24921,24923,24925,24926,24928,24929,24931,24932,24934,24935,24937,24938,
+24940,24941,24943,24944,24946,24947,24949,24950,24952,24953,24955,24956,24958,
+24959,24961,24962,24964,24965,24967,24968,24970,24972,24973,24975,24976,24978,
+24979,24981,24982,24984,24985,24987,24988,24990,24991,24993,24994,24996,24997,
+24999,25000,25002,25003,25005,25006,25008,25009,25011,25012,25014,25015,25017,
+25018,25020,25021,25023,25024,25026,25027,25029,25031,25032,25034,25035,25037,
+25038,25040,25041,25043,25044,25046,25047,25049,25050,25052,25053,25055,25056,
+25058,25059,25061,25062,25064,25065,25067,25068,25070,25071,25073,25074,25076,
+25077,25079,25080,25082,25083,25085,25086,25088,25089,25091,25092,25094,25095,
+25097,25098,25100,25101,25103,25104,25106,25107,25109,25110,25112,25113,25115,
+25116,25118,25119,25121,25122,25124,25125,25127,25128,25130,25131,25133,25134,
+25136,25137,25139,25140,25142,25143,25145,25146,25148,25149,25151,25152,25154,
+25155,25157,25158,25160,25161,25163,25164,25166,25167,25169,25170,25172,25173,
+25175,25176,25178,25179,25181,25182,25184,25185,25187,25188,25190,25191,25193,
+25194,25196,25197,25199,25200,25202,25203,25205,25206,25208,25209,25211,25212,
+25214,25215,25217,25218,25220,25221,25223,25224,25226,25227,25229,25230,25232,
+25233,25235,25236,25238,25239,25241,25242,25244,25245,25247,25248,25250,25251,
+25253,25254,25256,25257,25259,25260,25262,25263,25265,25266,25268,25269,25271,
+25272,25274,25275,25277,25278,25280,25281,25283,25284,25286,25287,25289,25290,
+25292,25293,25295,25296,25298,25299,25301,25302,25304,25305,25306,25308,25309,
+25311,25312,25314,25315,25317,25318,25320,25321,25323,25324,25326,25327,25329,
+25330,25332,25333,25335,25336,25338,25339,25341,25342,25344,25345,25347,25348,
+25350,25351,25353,25354,25356,25357,25359,25360,25362,25363,25365,25366,25367,
+25369,25370,25372,25373,25375,25376,25378,25379,25381,25382,25384,25385,25387,
+25388,25390,25391,25393,25394,25396,25397,25399,25400,25402,25403,25405,25406,
+25408,25409,25411,25412,25413,25415,25416,25418,25419,25421,25422,25424,25425,
+25427,25428,25430,25431,25433,25434,25436,25437,25439,25440,25442,25443,25445,
+25446,25448,25449,25451,25452,25453,25455,25456,25458,25459,25461,25462,25464,
+25465,25467,25468,25470,25471,25473,25474,25476,25477,25479,25480,25482,25483,
+25485,25486,25487,25489,25490,25492,25493,25495,25496,25498,25499,25501,25502,
+25504,25505,25507,25508,25510,25511,25513,25514,25516,25517,25518,25520,25521,
+25523,25524,25526,25527,25529,25530,25532,25533,25535,25536,25538,25539,25541,
+25542,25544,25545,25546,25548,25549,25551,25552,25554,25555,25557,25558,25560,
+25561,25563,25564,25566,25567,25569,25570,25571,25573,25574,25576,25577,25579,
+25580,25582,25583,25585,25586,25588,25589,25591,25592,25594,25595,25596,25598,
+25599,25601,25602,25604,25605,25607,25608,25610,25611,25613,25614,25616,25617,
+25619,25620,25621,25623,25624,25626,25627,25629,25630,25632,25633,25635,25636,
+25638,25639,25641,25642,25643,25645,25646,25648,25649,25651,25652,25654,25655,
+25657,25658,25660,25661,25662,25664,25665,25667,25668,25670,25671,25673,25674,
+25676,25677,25679,25680,25682,25683,25684,25686,25687,25689,25690,25692,25693,
+25695,25696,25698,25699,25701,25702,25703,25705,25706,25708,25709,25711,25712,
+25714,25715,25717,25718,25720,25721,25722,25724,25725,25727,25728,25730,25731,
+25733,25734,25736,25737,25739,25740,25741,25743,25744,25746,25747,25749,25750,
+25752,25753,25755,25756,25757,25759,25760,25762,25763,25765,25766,25768,25769,
+25771,25772,25774,25775,25776,25778,25779,25781,25782,25784,25785,25787,25788,
+25790,25791,25792,25794,25795,25797,25798,25800,25801,25803,25804,25806,25807,
+25808,25810,25811,25813,25814,25816,25817,25819,25820,25822,25823,25824,25826,
+25827,25829,25830,25832,25833,25835,25836,25838,25839,25840,25842,25843,25845,
+25846,25848,25849,25851,25852,25853,25855,25856,25858,25859,25861,25862,25864,
+25865,25867,25868,25869,25871,25872,25874,25875,25877,25878,25880,25881,25882,
+25884,25885,25887,25888,25890,25891,25893,25894,25896,25897,25898,25900,25901,
+25903,25904,25906,25907,25909,25910,25911,25913,25914,25916,25917,25919,25920,
+25922,25923,25924,25926,25927,25929,25930,25932,25933,25935,25936,25937,25939,
+25940,25942,25943,25945,25946,25948,25949,25951,25952,25953,25955,25956,25958,
+25959,25961,25962,25963,25965,25966,25968,25969,25971,25972,25974,25975,25976,
+25978,25979,25981,25982,25984,25985,25987,25988,25989,25991,25992,25994,25995,
+25997,25998,26000,26001,26002,26004,26005,26007,26008,26010,26011,26013,26014,
+26015,26017,26018,26020,26021,26023,26024,26025,26027,26028,26030,26031,26033,
+26034,26036,26037,26038,26040,26041,26043,26044,26046,26047,26049,26050,26051,
+26053,26054,26056,26057,26059,26060,26061,26063,26064,26066,26067,26069,26070,
+26072,26073,26074,26076,26077,26079,26080,26082,26083,26084,26086,26087,26089,
+26090,26092,26093,26094,26096,26097,26099,26100,26102,26103,26105,26106,26107,
+26109,26110,26112,26113,26115,26116,26117,26119,26120,26122,26123,26125,26126,
+26127,26129,26130,26132,26133,26135,26136,26137,26139,26140,26142,26143,26145,
+26146,26148,26149,26150,26152,26153,26155,26156,26158,26159,26160,26162,26163,
+26165,26166,26168,26169,26170,26172,26173,26175,26176,26178,26179,26180,26182,
+26183,26185,26186,26188,26189,26190,26192,26193,26195,26196,26198,26199,26200,
+26202,26203,26205,26206,26208,26209,26210,26212,26213,26215,26216,26218,26219,
+26220,26222,26223,26225,26226,26228,26229,26230,26232,26233,26235,26236,26237,
+26239,26240,26242,26243,26245,26246,26247,26249,26250,26252,26253,26255,26256,
+26257,26259,26260,26262,26263,26265,26266,26267,26269,26270,26272,26273,26275,
+26276,26277,26279,26280,26282,26283,26284,26286,26287,26289,26290,26292,26293,
+26294,26296,26297,26299,26300,26302,26303,26304,26306,26307,26309,26310,26311,
+26313,26314,26316,26317,26319,26320,26321,26323,26324,26326,26327,26329,26330,
+26331,26333,26334,26336,26337,26338,26340,26341,26343,26344,26346,26347,26348,
+26350,26351,26353,26354,26355,26357,26358,26360,26361,26363,26364,26365,26367,
+26368,26370,26371,26372,26374,26375,26377,26378,26380,26381,26382,26384,26385,
+26387,26388,26389,26391,26392,26394,26395,26397,26398,26399,26401,26402,26404,
+26405,26406,26408,26409,26411,26412,26413,26415,26416,26418,26419,26421,26422,
+26423,26425,26426,26428,26429,26430,26432,26433,26435,26436,26438,26439,26440,
+26442,26443,26445,26446,26447,26449,26450,26452,26453,26454,26456,26457,26459,
+26460,26462,26463,26464,26466,26467,26469,26470,26471,26473,26474,26476,26477,
+26478,26480,26481,26483,26484,26485,26487,26488,26490,26491,26493,26494,26495,
+26497,26498,26500,26501,26502,26504,26505,26507,26508,26509,26511,26512,26514,
+26515,26516,26518,26519,26521,26522,26523,26525,26526,26528,26529,26531,26532,
+26533,26535,26536,26538,26539,26540,26542,26543,26545,26546,26547,26549,26550,
+26552,26553,26554,26556,26557,26559,26560,26561,26563,26564,26566,26567,26568,
+26570,26571,26573,26574,26575,26577,26578,26580,26581,26582,26584,26585,26587,
+26588,26589,26591,26592,26594,26595,26596,26598,26599,26601,26602,26603,26605,
+26606,26608,26609,26610,26612,26613,26615,26616,26617,26619,26620,26622,26623,
+26624,26626,26627,26629,26630,26631,26633,26634,26636,26637,26638,26640,26641,
+26643,26644,26645,26647,26648,26650,26651,26652,26654,26655,26657,26658,26659,
+26661,26662,26664,26665,26666,26668,26669,26671,26672,26673,26675,26676,26678,
+26679,26680,26682,26683,26685,26686,26687,26689,26690,26692,26693,26694,26696,
+26697,26699,26700,26701,26703,26704,26706,26707,26708,26710,26711,26713,26714,
+26715,26717,26718,26719,26721,26722,26724,26725,26726,26728,26729,26731,26732,
+26733,26735,26736,26738,26739,26740,26742,26743,26745,26746,26747,26749,26750,
+26752,26753,26754,26756,26757,26758,26760,26761,26763,26764,26765,26767,26768,
+26770,26771,26772,26774,26775,26777,26778,26779,26781,26782,26783,26785,26786,
+26788,26789,26790,26792,26793,26795,26796,26797,26799,26800,26802,26803,26804,
+26806,26807,26808,26810,26811,26813,26814,26815,26817,26818,26820,26821,26822,
+26824,26825,26827,26828,26829,26831,26832,26833,26835,26836,26838,26839,26840,
+26842,26843,26845,26846,26847,26849,26850,26851,26853,26854,26856,26857,26858,
+26860,26861,26863,26864,26865,26867,26868,26869,26871,26872,26874,26875,26876,
+26878,26879,26881,26882,26883,26885,26886,26887,26889,26890,26892,26893,26894,
+26896,26897,26899,26900,26901,26903,26904,26905,26907,26908,26910,26911,26912,
+26914,26915,26916,26918,26919,26921,26922,26923,26925,26926,26928,26929,26930,
+26932,26933,26934,26936,26937,26939,26940,26941,26943,26944,26945,26947,26948,
+26950,26951,26952,26954,26955,26956,26958,26959,26961,26962,26963,26965,26966,
+26968,26969,26970,26972,26973,26974,26976,26977,26979,26980,26981,26983,26984,
+26985,26987,26988,26990,26991,26992,26994,26995,26996,26998,26999,27001,27002,
+27003,27005,27006,27007,27009,27010,27012,27013,27014,27016,27017,27018,27020,
+27021,27023,27024,27025,27027,27028,27029,27031,27032,27034,27035,27036,27038,
+27039,27040,27042,27043,27045,27046,27047,27049,27050,27051,27053,27054,27056,
+27057,27058,27060,27061,27062,27064,27065,27067,27068,27069,27071,27072,27073,
+27075,27076,27077,27079,27080,27082,27083,27084,27086,27087,27088,27090,27091,
+27093,27094,27095,27097,27098,27099,27101,27102,27104,27105,27106,27108,27109,
+27110,27112,27113,27114,27116,27117,27119,27120,27121,27123,27124,27125,27127,
+27128,27130,27131,27132,27134,27135,27136,27138,27139,27140,27142,27143,27145,
+27146,27147,27149,27150,27151,27153,27154,27155,27157,27158,27160,27161,27162,
+27164,27165,27166,27168,27169,27171,27172,27173,27175,27176,27177,27179,27180,
+27181,27183,27184,27186,27187,27188,27190,27191,27192,27194,27195,27196,27198,
+27199,27201,27202,27203,27205,27206,27207,27209,27210,27211,27213,27214,27216,
+27217,27218,27220,27221,27222,27224,27225,27226,27228,27229,27230,27232,27233,
+27235,27236,27237,27239,27240,27241,27243,27244,27245,27247,27248,27250,27251,
+27252,27254,27255,27256,27258,27259,27260,27262,27263,27264,27266,27267,27269,
+27270,27271,27273,27274,27275,27277,27278,27279,27281,27282,27284,27285,27286,
+27288,27289,27290,27292,27293,27294,27296,27297,27298,27300,27301,27303,27304,
+27305,27307,27308,27309,27311,27312,27313,27315,27316,27317,27319,27320,27322,
+27323,27324,27326,27327,27328,27330,27331,27332,27334,27335,27336,27338,27339,
+27340,27342,27343,27345,27346,27347,27349,27350,27351,27353,27354,27355,27357,
+27358,27359,27361,27362,27364,27365,27366,27368,27369,27370,27372,27373,27374,
+27376,27377,27378,27380,27381,27382,27384,27385,27387,27388,27389,27391,27392,
+27393,27395,27396,27397,27399,27400,27401,27403,27404,27405,27407,27408,27409,
+27411,27412,27414,27415,27416,27418,27419,27420,27422,27423,27424,27426,27427,
+27428,27430,27431,27432,27434,27435,27436,27438,27439,27441,27442,27443,27445,
+27446,27447,27449,27450,27451,27453,27454,27455,27457,27458,27459,27461,27462,
+27463,27465,27466,27467,27469,27470,27472,27473,27474,27476,27477,27478,27480,
+27481,27482,27484,27485,27486,27488,27489,27490,27492,27493,27494,27496,27497,
+27498,27500,27501,27502,27504,27505,27506,27508,27509,27511,27512,27513,27515,
+27516,27517,27519,27520,27521,27523,27524,27525,27527,27528,27529,27531,27532,
+27533,27535,27536,27537,27539,27540,27541,27543,27544,27545,27547,27548,27549,
+27551,27552,27554,27555,27556,27558,27559,27560,27562,27563,27564,27566,27567,
+27568,27570,27571,27572,27574,27575,27576,27578,27579,27580,27582,27583,27584,
+27586,27587,27588,27590,27591,27592,27594,27595,27596,27598,27599,27600,27602,
+27603,27604,27606,27607,27608,27610,27611,27612,27614,27615,27616,27618,27619,
+27620,27622,27623,27624,27626,27627,27629,27630,27631,27633,27634,27635,27637,
+27638,27639,27641,27642,27643,27645,27646,27647,27649,27650,27651,27653,27654,
+27655,27657,27658,27659,27661,27662,27663,27665,27666,27667,27669,27670,27671,
+27673,27674,27675,27677,27678,27679,27681,27682,27683,27685,27686,27687,27689,
+27690,27691,27693,27694,27695,27697,27698,27699,27701,27702,27703,27705,27706,
+27707,27709,27710,27711,27713,27714,27715,27717,27718,27719,27721,27722,27723,
+27725,27726,27727,27729,27730,27731,27733,27734,27735,27737,27738,27739,27741,
+27742,27743,27745,27746,27747,27749,27750,27751,27753,27754,27755,27757,27758,
+27759,27761,27762,27763,27764,27766,27767,27768,27770,27771,27772,27774,27775,
+27776,27778,27779,27780,27782,27783,27784,27786,27787,27788,27790,27791,27792,
+27794,27795,27796,27798,27799,27800,27802,27803,27804,27806,27807,27808,27810,
+27811,27812,27814,27815,27816,27818,27819,27820,27822,27823,27824,27826,27827,
+27828,27830,27831,27832,27833,27835,27836,27837,27839,27840,27841,27843,27844,
+27845,27847,27848,27849,27851,27852,27853,27855,27856,27857,27859,27860,27861,
+27863,27864,27865,27867,27868,27869,27871,27872,27873,27875,27876,27877,27879,
+27880,27881,27882,27884,27885,27886,27888,27889,27890,27892,27893,27894,27896,
+27897,27898,27900,27901,27902,27904,27905,27906,27908,27909,27910,27912,27913,
+27914,27915,27917,27918,27919,27921,27922,27923,27925,27926,27927,27929,27930,
+27931,27933,27934,27935,27937,27938,27939,27941,27942,27943,27945,27946,27947,
+27948,27950,27951,27952,27954,27955,27956,27958,27959,27960,27962,27963,27964,
+27966,27967,27968,27970,27971,27972,27974,27975,27976,27977,27979,27980,27981,
+27983,27984,27985,27987,27988,27989,27991,27992,27993,27995,27996,27997,27999,
+28000,28001,28002,28004,28005,28006,28008,28009,28010,28012,28013,28014,28016,
+28017,28018,28020,28021,28022,28023,28025,28026,28027,28029,28030,28031,28033,
+28034,28035,28037,28038,28039,28041,28042,28043,28045,28046,28047,28048,28050,
+28051,28052,28054,28055,28056,28058,28059,28060,28062,28063,28064,28066,28067,
+28068,28069,28071,28072,28073,28075,28076,28077,28079,28080,28081,28083,28084,
+28085,28086,28088,28089,28090,28092,28093,28094,28096,28097,28098,28100,28101,
+28102,28104,28105,28106,28107,28109,28110,28111,28113,28114,28115,28117,28118,
+28119,28121,28122,28123,28124,28126,28127,28128,28130,28131,28132,28134,28135,
+28136,28138,28139,28140,28141,28143,28144,28145,28147,28148,28149,28151,28152,
+28153,28155,28156,28157,28158,28160,28161,28162,28164,28165,28166,28168,28169,
+28170,28171,28173,28174,28175,28177,28178,28179,28181,28182,28183,28185,28186,
+28187,28188,28190,28191,28192,28194,28195,28196,28198,28199,28200,28201,28203,
+28204,28205,28207,28208,28209,28211,28212,28213,28215,28216,28217,28218,28220,
+28221,28222,28224,28225,28226,28228,28229,28230,28231,28233,28234,28235,28237,
+28238,28239,28241,28242,28243,28244,28246,28247,28248,28250,28251,28252,28254,
+28255,28256,28257,28259,28260,28261,28263,28264,28265,28267,28268,28269,28270,
+28272,28273,28274,28276,28277,28278,28280,28281,28282,28283,28285,28286,28287,
+28289,28290,28291,28293,28294,28295,28296,28298,28299,28300,28302,28303,28304,
+28306,28307,28308,28309,28311,28312,28313,28315,28316,28317,28319,28320,28321,
+28322,28324,28325,28326,28328,28329,28330,28331,28333,28334,28335,28337,28338,
+28339,28341,28342,28343,28344,28346,28347,28348,28350,28351,28352,28353,28355,
+28356,28357,28359,28360,28361,28363,28364,28365,28366,28368,28369,28370,28372,
+28373,28374,28375,28377,28378,28379,28381,28382,28383,28385,28386,28387,28388,
+28390,28391,28392,28394,28395,28396,28397,28399,28400,28401,28403,28404,28405,
+28407,28408,28409,28410,28412,28413,28414,28416,28417,28418,28419,28421,28422,
+28423,28425,28426,28427,28428,28430,28431,28432,28434,28435,28436,28438,28439,
+28440,28441,28443,28444,28445,28447,28448,28449,28450,28452,28453,28454,28456,
+28457,28458,28459,28461,28462,28463,28465,28466,28467,28468,28470,28471,28472,
+28474,28475,28476,28477,28479,28480,28481,28483,28484,28485,28486,28488,28489,
+28490,28492,28493,28494,28495,28497,28498,28499,28501,28502,28503,28504,28506,
+28507,28508,28510,28511,28512,28514,28515,28516,28517,28519,28520,28521,28523,
+28524,28525,28526,28528,28529,28530,28531,28533,28534,28535,28537,28538,28539,
+28540,28542,28543,28544,28546,28547,28548,28549,28551,28552,28553,28555,28556,
+28557,28558,28560,28561,28562,28564,28565,28566,28567,28569,28570,28571,28573,
+28574,28575,28576,28578,28579,28580,28582,28583,28584,28585,28587,28588,28589,
+28591,28592,28593,28594,28596,28597,28598,28599,28601,28602,28603,28605,28606,
+28607,28608,28610,28611,28612,28614,28615,28616,28617,28619,28620,28621,28623,
+28624,28625,28626,28628,28629,28630,28632,28633,28634,28635,28637,28638,28639,
+28640,28642,28643,28644,28646,28647,28648,28649,28651,28652,28653,28655,28656,
+28657,28658,28660,28661,28662,28663,28665,28666,28667,28669,28670,28671,28672,
+28674,28675,28676,28678,28679,28680,28681,28683,28684,28685,28686,28688,28689,
+28690,28692,28693,28694,28695,28697,28698,28699,28700,28702,28703,28704,28706,
+28707,28708,28709,28711,28712,28713,28715,28716,28717,28718,28720,28721,28722,
+28723,28725,28726,28727,28729,28730,28731,28732,28734,28735,28736,28737,28739,
+28740,28741,28743,28744,28745,28746,28748,28749,28750,28751,28753,28754,28755,
+28757,28758,28759,28760,28762,28763,28764,28765,28767,28768,28769,28771,28772,
+28773,28774,28776,28777,28778,28779,28781,28782,28783,28785,28786,28787,28788,
+28790,28791,28792,28793,28795,28796,28797,28798,28800,28801,28802,28804,28805,
+28806,28807,28809,28810,28811,28812,28814,28815,28816,28818,28819,28820,28821,
+28823,28824,28825,28826,28828,28829,28830,28831,28833,28834,28835,28837,28838,
+28839,28840,28842,28843,28844,28845,28847,28848,28849,28851,28852,28853,28854,
+28856,28857,28858,28859,28861,28862,28863,28864,28866,28867,28868,28870,28871,
+28872,28873,28875,28876,28877,28878,28880,28881,28882,28883,28885,28886,28887,
+28888,28890,28891,28892,28894,28895,28896,28897,28899,28900,28901,28902,28904,
+28905,28906,28907,28909,28910,28911,28913,28914,28915,28916,28918,28919,28920,
+28921,28923,28924,28925,28926,28928,28929,28930,28931,28933,28934,28935,28937,
+28938,28939,28940,28942,28943,28944,28945,28947,28948,28949,28950,28952,28953,
+28954,28955,28957,28958,28959,28960,28962,28963,28964,28966,28967,28968,28969,
+28971,28972,28973,28974,28976,28977,28978,28979,28981,28982,28983,28984,28986,
+28987,28988,28989,28991,28992,28993,28995,28996,28997,28998,29000,29001,29002,
+29003,29005,29006,29007,29008,29010,29011,29012,29013,29015,29016,29017,29018,
+29020,29021,29022,29023,29025,29026,29027,29028,29030,29031,29032,29034,29035,
+29036,29037,29039,29040,29041,29042,29044,29045,29046,29047,29049,29050,29051,
+29052,29054,29055,29056,29057,29059,29060,29061,29062,29064,29065,29066,29067,
+29069,29070,29071,29072,29074,29075,29076,29077,29079,29080,29081,29083,29084,
+29085,29086,29088,29089,29090,29091,29093,29094,29095,29096,29098,29099,29100,
+29101,29103,29104,29105,29106,29108,29109,29110,29111,29113,29114,29115,29116,
+29118,29119,29120,29121,29123,29124,29125,29126,29128,29129,29130,29131,29133,
+29134,29135,29136,29138,29139,29140,29141,29143,29144,29145,29146,29148,29149,
+29150,29151,29153,29154,29155,29156,29158,29159,29160,29161,29163,29164,29165,
+29166,29168,29169,29170,29171,29173,29174,29175,29176,29178,29179,29180,29181,
+29183,29184,29185,29186,29188,29189,29190,29191,29193,29194,29195,29196,29198,
+29199,29200,29201,29203,29204,29205,29206,29208,29209,29210,29211,29213,29214,
+29215,29216,29218,29219,29220,29221,29223,29224,29225,29226,29228,29229,29230,
+29231,29233,29234,29235,29236,29238,29239,29240,29241,29243,29244,29245,29246,
+29248,29249,29250,29251,29253,29254,29255,29256,29258,29259,29260,29261,29262,
+29264,29265,29266,29267,29269,29270,29271,29272,29274,29275,29276,29277,29279,
+29280,29281,29282,29284,29285,29286,29287,29289,29290,29291,29292,29294,29295,
+29296,29297,29299,29300,29301,29302,29304,29305,29306,29307,29309,29310,29311,
+29312,29313,29315,29316,29317,29318,29320,29321,29322,29323,29325,29326,29327,
+29328,29330,29331,29332,29333,29335,29336,29337,29338,29340,29341,29342,29343,
+29345,29346,29347,29348,29349,29351,29352,29353,29354,29356,29357,29358,29359,
+29361,29362,29363,29364,29366,29367,29368,29369,29371,29372,29373,29374,29376,
+29377,29378,29379,29380,29382,29383,29384,29385,29387,29388,29389,29390,29392,
+29393,29394,29395,29397,29398,29399,29400,29402,29403,29404,29405,29406,29408,
+29409,29410,29411,29413,29414,29415,29416,29418,29419,29420,29421,29423,29424,
+29425,29426,29428,29429,29430,29431,29432,29434,29435,29436,29437,29439,29440,
+29441,29442,29444,29445,29446,29447,29449,29450,29451,29452,29453,29455,29456,
+29457,29458,29460,29461,29462,29463,29465,29466,29467,29468,29470,29471,29472,
+29473,29474,29476,29477,29478,29479,29481,29482,29483,29484,29486,29487,29488,
+29489,29490,29492,29493,29494,29495,29497,29498,29499,29500,29502,29503,29504,
+29505,29507,29508,29509,29510,29511,29513,29514,29515,29516,29518,29519,29520,
+29521,29523,29524,29525,29526,29527,29529,29530,29531,29532,29534,29535,29536,
+29537,29539,29540,29541,29542,29543,29545,29546,29547,29548,29550,29551,29552,
+29553,29555,29556,29557,29558,29559,29561,29562,29563,29564,29566,29567,29568,
+29569,29570,29572,29573,29574,29575,29577,29578,29579,29580,29582,29583,29584,
+29585,29586,29588,29589,29590,29591,29593,29594,29595,29596,29598,29599,29600,
+29601,29602,29604,29605,29606,29607,29609,29610,29611,29612,29613,29615,29616,
+29617,29618,29620,29621,29622,29623,29625,29626,29627,29628,29629,29631,29632,
+29633,29634,29636,29637,29638,29639,29640,29642,29643,29644,29645,29647,29648,
+29649,29650,29651,29653,29654,29655,29656,29658,29659,29660,29661,29662,29664,
+29665,29666,29667,29669,29670,29671,29672,29673,29675,29676,29677,29678,29680,
+29681,29682,29683,29685,29686,29687,29688,29689,29691,29692,29693,29694,29696,
+29697,29698,29699,29700,29702,29703,29704,29705,29707,29708,29709,29710,29711,
+29713,29714,29715,29716,29718,29719,29720,29721,29722,29724,29725,29726,29727,
+29728,29730,29731,29732,29733,29735,29736,29737,29738,29739,29741,29742,29743,
+29744,29746,29747,29748,29749,29750,29752,29753,29754,29755,29757,29758,29759,
+29760,29761,29763,29764,29765,29766,29768,29769,29770,29771,29772,29774,29775,
+29776,29777,29778,29780,29781,29782,29783,29785,29786,29787,29788,29789,29791,
+29792,29793,29794,29796,29797,29798,29799,29800,29802,29803,29804,29805,29806,
+29808,29809,29810,29811,29813,29814,29815,29816,29817,29819,29820,29821,29822,
+29824,29825,29826,29827,29828,29830,29831,29832,29833,29834,29836,29837,29838,
+29839,29841,29842,29843,29844,29845,29847,29848,29849,29850,29851,29853,29854,
+29855,29856,29858,29859,29860,29861,29862,29864,29865,29866,29867,29868,29870,
+29871,29872,29873,29875,29876,29877,29878,29879,29881,29882,29883,29884,29885,
+29887,29888,29889,29890,29892,29893,29894,29895,29896,29898,29899,29900,29901,
+29902,29904,29905,29906,29907,29908,29910,29911,29912,29913,29915,29916,29917,
+29918,29919,29921,29922,29923,29924,29925,29927,29928,29929,29930,29931,29933,
+29934,29935,29936,29938,29939,29940,29941,29942,29944,29945,29946,29947,29948,
+29950,29951,29952,29953,29954,29956,29957,29958,29959,29961,29962,29963,29964,
+29965,29967,29968,29969,29970,29971,29973,29974,29975,29976,29977,29979,29980,
+29981,29982,29983,29985,29986,29987,29988,29990,29991,29992,29993,29994,29996,
+29997,29998,29999,30000,30002,30003,30004,30005,30006,30008,30009,30010,30011,
+30012,30014,30015,30016,30017,30018,30020,30021,30022,30023,30025,30026,30027,
+30028,30029,30031,30032,30033,30034,30035,30037,30038,30039,30040,30041,30043,
+30044,30045,30046,30047,30049,30050,30051,30052,30053,30055,30056,30057,30058,
+30059,30061,30062,30063,30064,30065,30067,30068,30069,30070,30072,30073,30074,
+30075,30076,30078,30079,30080,30081,30082,30084,30085,30086,30087,30088,30090,
+30091,30092,30093,30094,30096,30097,30098,30099,30100,30102,30103,30104,30105,
+30106,30108,30109,30110,30111,30112,30114,30115,30116,30117,30118,30120,30121,
+30122,30123,30124,30126,30127,30128,30129,30130,30132,30133,30134,30135,30136,
+30138,30139,30140,30141,30142,30144,30145,30146,30147,30148,30150,30151,30152,
+30153,30154,30156,30157,30158,30159,30160,30162,30163,30164,30165,30166,30168,
+30169,30170,30171,30172,30174,30175,30176,30177,30178,30180,30181,30182,30183,
+30184,30186,30187,30188,30189,30190,30192,30193,30194,30195,30196,30198,30199,
+30200,30201,30202,30204,30205,30206,30207,30208,30209,30211,30212,30213,30214,
+30215,30217,30218,30219,30220,30221,30223,30224,30225,30226,30227,30229,30230,
+30231,30232,30233,30235,30236,30237,30238,30239,30241,30242,30243,30244,30245,
+30247,30248,30249,30250,30251,30253,30254,30255,30256,30257,30259,30260,30261,
+30262,30263,30264,30266,30267,30268,30269,30270,30272,30273,30274,30275,30276,
+30278,30279,30280,30281,30282,30284,30285,30286,30287,30288,30290,30291,30292,
+30293,30294,30295,30297,30298,30299,30300,30301,30303,30304,30305,30306,30307,
+30309,30310,30311,30312,30313,30315,30316,30317,30318,30319,30321,30322,30323,
+30324,30325,30326,30328,30329,30330,30331,30332,30334,30335,30336,30337,30338,
+30340,30341,30342,30343,30344,30346,30347,30348,30349,30350,30351,30353,30354,
+30355,30356,30357,30359,30360,30361,30362,30363,30365,30366,30367,30368,30369,
+30370,30372,30373,30374,30375,30376,30378,30379,30380,30381,30382,30384,30385,
+30386,30387,30388,30390,30391,30392,30393,30394,30395,30397,30398,30399,30400,
+30401,30403,30404,30405,30406,30407,30408,30410,30411,30412,30413,30414,30416,
+30417,30418,30419,30420,30422,30423,30424,30425,30426,30427,30429,30430,30431,
+30432,30433,30435,30436,30437,30438,30439,30441,30442,30443,30444,30445,30446,
+30448,30449,30450,30451,30452,30454,30455,30456,30457,30458,30459,30461,30462,
+30463,30464,30465,30467,30468,30469,30470,30471,30472,30474,30475,30476,30477,
+30478,30480,30481,30482,30483,30484,30486,30487,30488,30489,30490,30491,30493,
+30494,30495,30496,30497,30499,30500,30501,30502,30503,30504,30506,30507,30508,
+30509,30510,30512,30513,30514,30515,30516,30517,30519,30520,30521,30522,30523,
+30525,30526,30527,30528,30529,30530,30532,30533,30534,30535,30536,30538,30539,
+30540,30541,30542,30543,30545,30546,30547,30548,30549,30550,30552,30553,30554,
+30555,30556,30558,30559,30560,30561,30562,30563,30565,30566,30567,30568,30569,
+30571,30572,30573,30574,30575,30576,30578,30579,30580,30581,30582,30584,30585,
+30586,30587,30588,30589,30591,30592,30593,30594,30595,30596,30598,30599,30600,
+30601,30602,30604,30605,30606,30607,30608,30609,30611,30612,30613,30614,30615,
+30616,30618,30619,30620,30621,30622,30624,30625,30626,30627,30628,30629,30631,
+30632,30633,30634,30635,30636,30638,30639,30640,30641,30642,30644,30645,30646,
+30647,30648,30649,30651,30652,30653,30654,30655,30656,30658,30659,30660,30661,
+30662,30663,30665,30666,30667,30668,30669,30671,30672,30673,30674,30675,30676,
+30678,30679,30680,30681,30682,30683,30685,30686,30687,30688,30689,30690,30692,
+30693,30694,30695,30696,30698,30699,30700,30701,30702,30703,30705,30706,30707,
+30708,30709,30710,30712,30713,30714,30715,30716,30717,30719,30720,30721,30722,
+30723,30724,30726,30727,30728,30729,30730,30732,30733,30734,30735,30736,30737,
+30739,30740,30741,30742,30743,30744,30746,30747,30748,30749,30750,30751,30753,
+30754,30755,30756,30757,30758,30760,30761,30762,30763,30764,30765,30767,30768,
+30769,30770,30771,30772,30774,30775,30776,30777,30778,30779,30781,30782,30783,
+30784,30785,30786,30788,30789,30790,30791,30792,30794,30795,30796,30797,30798,
+30799,30801,30802,30803,30804,30805,30806,30808,30809,30810,30811,30812,30813,
+30815,30816,30817,30818,30819,30820,30822,30823,30824,30825,30826,30827,30829,
+30830,30831,30832,30833,30834,30836,30837,30838,30839,30840,30841,30843,30844,
+30845,30846,30847,30848,30850,30851,30852,30853,30854,30855,30857,30858,30859,
+30860,30861,30862,30864,30865,30866,30867,30868,30869,30870,30872,30873,30874,
+30875,30876,30877,30879,30880,30881,30882,30883,30884,30886,30887,30888,30889,
+30890,30891,30893,30894,30895,30896,30897,30898,30900,30901,30902,30903,30904,
+30905,30907,30908,30909,30910,30911,30912,30914,30915,30916,30917,30918,30919,
+30921,30922,30923,30924,30925,30926,30927,30929,30930,30931,30932,30933,30934,
+30936,30937,30938,30939,30940,30941,30943,30944,30945,30946,30947,30948,30950,
+30951,30952,30953,30954,30955,30957,30958,30959,30960,30961,30962,30963,30965,
+30966,30967,30968,30969,30970,30972,30973,30974,30975,30976,30977,30979,30980,
+30981,30982,30983,30984,30986,30987,30988,30989,30990,30991,30992,30994,30995,
+30996,30997,30998,30999,31001,31002,31003,31004,31005,31006,31008,31009,31010,
+31011,31012,31013,31014,31016,31017,31018,31019,31020,31021,31023,31024,31025,
+31026,31027,31028,31030,31031,31032,31033,31034,31035,31036,31038,31039,31040,
+31041,31042,31043,31045,31046,31047,31048,31049,31050,31051,31053,31054,31055,
+31056,31057,31058,31060,31061,31062,31063,31064,31065,31067,31068,31069,31070,
+31071,31072,31073,31075,31076,31077,31078,31079,31080,31082,31083,31084,31085,
+31086,31087,31088,31090,31091,31092,31093,31094,31095,31097,31098,31099,31100,
+31101,31102,31103,31105,31106,31107,31108,31109,31110,31112,31113,31114,31115,
+31116,31117,31118,31120,31121,31122,31123,31124,31125,31127,31128,31129,31130,
+31131,31132,31133,31135,31136,31137,31138,31139,31140,31141,31143,31144,31145,
+31146,31147,31148,31150,31151,31152,31153,31154,31155,31156,31158,31159,31160,
+31161,31162,31163,31165,31166,31167,31168,31169,31170,31171,31173,31174,31175,
+31176,31177,31178,31179,31181,31182,31183,31184,31185,31186,31188,31189,31190,
+31191,31192,31193,31194,31196,31197,31198,31199,31200,31201,31202,31204,31205,
+31206,31207,31208,31209,31211,31212,31213,31214,31215,31216,31217,31219,31220,
+31221,31222,31223,31224,31225,31227,31228,31229,31230,31231,31232,31233,31235,
+31236,31237,31238,31239,31240,31242,31243,31244,31245,31246,31247,31248,31250,
+31251,31252,31253,31254,31255,31256,31258,31259,31260,31261,31262,31263,31264,
+31266,31267,31268,31269,31270,31271,31272,31274,31275,31276,31277,31278,31279,
+31280,31282,31283,31284,31285,31286,31287,31289,31290,31291,31292,31293,31294,
+31295,31297,31298,31299,31300,31301,31302,31303,31305,31306,31307,31308,31309,
+31310,31311,31313,31314,31315,31316,31317,31318,31319,31321,31322,31323,31324,
+31325,31326,31327,31329,31330,31331,31332,31333,31334,31335,31337,31338,31339,
+31340,31341,31342,31343,31345,31346,31347,31348,31349,31350,31351,31353,31354,
+31355,31356,31357,31358,31359,31361,31362,31363,31364,31365,31366,31367,31369,
+31370,31371,31372,31373,31374,31375,31377,31378,31379,31380,31381,31382,31383,
+31385,31386,31387,31388,31389,31390,31391,31392,31394,31395,31396,31397,31398,
+31399,31400,31402,31403,31404,31405,31406,31407,31408,31410,31411,31412,31413,
+31414,31415,31416,31418,31419,31420,31421,31422,31423,31424,31426,31427,31428,
+31429,31430,31431,31432,31434,31435,31436,31437,31438,31439,31440,31441,31443,
+31444,31445,31446,31447,31448,31449,31451,31452,31453,31454,31455,31456,31457,
+31459,31460,31461,31462,31463,31464,31465,31466,31468,31469,31470,31471,31472,
+31473,31474,31476,31477,31478,31479,31480,31481,31482,31484,31485,31486,31487,
+31488,31489,31490,31491,31493,31494,31495,31496,31497,31498,31499,31501,31502,
+31503,31504,31505,31506,31507,31509,31510,31511,31512,31513,31514,31515,31516,
+31518,31519,31520,31521,31522,31523,31524,31526,31527,31528,31529,31530,31531,
+31532,31533,31535,31536,31537,31538,31539,31540,31541,31543,31544,31545,31546,
+31547,31548,31549,31550,31552,31553,31554,31555,31556,31557,31558,31560,31561,
+31562,31563,31564,31565,31566,31567,31569,31570,31571,31572,31573,31574,31575,
+31577,31578,31579,31580,31581,31582,31583,31584,31586,31587,31588,31589,31590,
+31591,31592,31594,31595,31596,31597,31598,31599,31600,31601,31603,31604,31605,
+31606,31607,31608,31609,31610,31612,31613,31614,31615,31616,31617,31618,31620,
+31621,31622,31623,31624,31625,31626,31627,31629,31630,31631,31632,31633,31634,
+31635,31636,31638,31639,31640,31641,31642,31643,31644,31645,31647,31648,31649,
+31650,31651,31652,31653,31655,31656,31657,31658,31659,31660,31661,31662,31664,
+31665,31666,31667,31668,31669,31670,31671,31673,31674,31675,31676,31677,31678,
+31679,31680,31682,31683,31684,31685,31686,31687,31688,31689,31691,31692,31693,
+31694,31695,31696,31697,31698,31700,31701,31702,31703,31704,31705,31706,31707,
+31709,31710,31711,31712,31713,31714,31715,31717,31718,31719,31720,31721,31722,
+31723,31724,31726,31727,31728,31729,31730,31731,31732,31733,31735,31736,31737,
+31738,31739,31740,31741,31742,31744,31745,31746,31747,31748,31749,31750,31751,
+31753,31754,31755,31756,31757,31758,31759,31760,31761,31763,31764,31765,31766,
+31767,31768,31769,31770,31772,31773,31774,31775,31776,31777,31778,31779,31781,
+31782,31783,31784,31785,31786,31787,31788,31790,31791,31792,31793,31794,31795,
+31796,31797,31799,31800,31801,31802,31803,31804,31805,31806,31808,31809,31810,
+31811,31812,31813,31814,31815,31816,31818,31819,31820,31821,31822,31823,31824,
+31825,31827,31828,31829,31830,31831,31832,31833,31834,31836,31837,31838,31839,
+31840,31841,31842,31843,31845,31846,31847,31848,31849,31850,31851,31852,31853,
+31855,31856,31857,31858,31859,31860,31861,31862,31864,31865,31866,31867,31868,
+31869,31870,31871,31872,31874,31875,31876,31877,31878,31879,31880,31881,31883,
+31884,31885,31886,31887,31888,31889,31890,31892,31893,31894,31895,31896,31897,
+31898,31899,31900,31902,31903,31904,31905,31906,31907,31908,31909,31910,31912,
+31913,31914,31915,31916,31917,31918,31919,31921,31922,31923,31924,31925,31926,
+31927,31928,31929,31931,31932,31933,31934,31935,31936,31937,31938,31940,31941,
+31942,31943,31944,31945,31946,31947,31948,31950,31951,31952,31953,31954,31955,
+31956,31957,31958,31960,31961,31962,31963,31964,31965,31966,31967,31969,31970,
+31971,31972,31973,31974,31975,31976,31977,31979,31980,31981,31982,31983,31984,
+31985,31986,31987,31989,31990,31991,31992,31993,31994,31995,31996,31997,31999,
+32000,32001,32002,32003,32004,32005,32006,32007,32009,32010,32011,32012,32013,
+32014,32015,32016,32018,32019,32020,32021,32022,32023,32024,32025,32026,32028,
+32029,32030,32031,32032,32033,32034,32035,32036,32038,32039,32040,32041,32042,
+32043,32044,32045,32046,32048,32049,32050,32051,32052,32053,32054,32055,32056,
+32058,32059,32060,32061,32062,32063,32064,32065,32066,32068,32069,32070,32071,
+32072,32073,32074,32075,32076,32078,32079,32080,32081,32082,32083,32084,32085,
+32086,32087,32089,32090,32091,32092,32093,32094,32095,32096,32097,32099,32100,
+32101,32102,32103,32104,32105,32106,32107,32109,32110,32111,32112,32113,32114,
+32115,32116,32117,32119,32120,32121,32122,32123,32124,32125,32126,32127,32129,
+32130,32131,32132,32133,32134,32135,32136,32137,32138,32140,32141,32142,32143,
+32144,32145,32146,32147,32148,32150,32151,32152,32153,32154,32155,32156,32157,
+32158,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32171,32172,
+32173,32174,32175,32176,32177,32178,32179,32181,32182,32183,32184,32185,32186,
+32187,32188,32189,32190,32192,32193,32194,32195,32196,32197,32198,32199,32200,
+32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32213,32214,32215,
+32216,32217,32218,32219,32220,32221,32222,32224,32225,32226,32227,32228,32229,
+32230,32231,32232,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,
+32245,32246,32247,32248,32249,32250,32251,32252,32253,32254,32256,32257,32258,
+32259,32260,32261,32262,32263,32264,32265,32267,32268,32269,32270,32271,32272,
+32273,32274,32275,32276,32278,32279,32280,32281,32282,32283,32284,32285,32286,
+32287,32289,32290,32291,32292,32293,32294,32295,32296,32297,32299,32300,32301,
+32302,32303,32304,32305,32306,32307,32308,32310,32311,32312,32313,32314,32315,
+32316,32317,32318,32319,32320,32322,32323,32324,32325,32326,32327,32328,32329,
+32330,32331,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32344,
+32345,32346,32347,32348,32349,32350,32351,32352,32353,32355,32356,32357,32358,
+32359,32360,32361,32362,32363,32364,32366,32367,32368,32369,32370,32371,32372,
+32373,32374,32375,32376,32378,32379,32380,32381,32382,32383,32384,32385,32386,
+32387,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32400,32401,
+32402,32403,32404,32405,32406,32407,32408,32409,32410,32412,32413,32414,32415,
+32416,32417,32418,32419,32420,32421,32423,32424,32425,32426,32427,32428,32429,
+32430,32431,32432,32433,32435,32436,32437,32438,32439,32440,32441,32442,32443,
+32444,32446,32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32458,
+32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32470,32471,32472,
+32473,32474,32475,32476,32477,32478,32479,32480,32482,32483,32484,32485,32486,
+32487,32488,32489,32490,32491,32493,32494,32495,32496,32497,32498,32499,32500,
+32501,32502,32503,32505,32506,32507,32508,32509,32510,32511,32512,32513,32514,
+32515,32517,32518,32519,32520,32521,32522,32523,32524,32525,32526,32527,32529,
+32530,32531,32532,32533,32534,32535,32536,32537,32538,32539,32541,32542,32543,
+32544,32545,32546,32547,32548,32549,32550,32551,32552,32554,32555,32556,32557,
+32558,32559,32560,32561,32562,32563,32564,32566,32567,32568,32569,32570,32571,
+32572,32573,32574,32575,32576,32578,32579,32580,32581,32582,32583,32584,32585,
+32586,32587,32588,32590,32591,32592,32593,32594,32595,32596,32597,32598,32599,
+32600,32601,32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,
+32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626,32628,
+32629,32630,32631,32632,32633,32634,32635,32636,32637,32638,32639,32641,32642,
+32643,32644,32645,32646,32647,32648,32649,32650,32651,32653,32654,32655,32656,
+32657,32658,32659,32660,32661,32662,32663,32664,32666,32667,32668,32669,32670,
+32671,32672,32673,32674,32675,32676,32677,32679,32680,32681,32682,32683,32684,
+32685,32686,32687,32688,32689,32690,32692,32693,32694,32695,32696,32697,32698,
+32699,32700,32701,32702,32703,32705,32706,32707,32708,32709,32710,32711,32712,
+32713,32714,32715,32716,32718,32719,32720,32721,32722,32723,32724,32725,32726,
+32727,32728,32729,32731,32732,32733,32734,32735,32736,32737,32738,32739,32740,
+32741,32742,32744,32745,32746,32747,32748,32749,32750,32751,32752,32753,32754,
+32755,32756,32758,32759,32760,32761,32762,32763,32764,32765,32766,32767,32768,
+32769,32771,32772,32773,32774,32775,32776,32777,32778,32779,32780,32781,32782,
+32783,32785,32786,32787,32788,32789,32790,32791,32792,32793,32794,32795,32796,
+32798,32799,32800,32801,32802,32803,32804,32805,32806,32807,32808,32809,32810,
+32812,32813,32814,32815,32816,32817,32818,32819,32820,32821,32822,32823,32824,
+32826,32827,32828,32829,32830,32831,32832,32833,32834,32835,32836,32837,32839,
+32840,32841,32842,32843,32844,32845,32846,32847,32848,32849,32850,32851,32853,
+32854,32855,32856,32857,32858,32859,32860,32861,32862,32863,32864,32865,32867,
+32868,32869,32870,32871,32872,32873,32874,32875,32876,32877,32878,32879,32880,
+32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,32894,
+32896,32897,32898,32899,32900,32901,32902,32903,32904,32905,32906,32907,32908,
+32910,32911,32912,32913,32914,32915,32916,32917,32918,32919,32920,32921,32922,
+32923,32925,32926,32927,32928,32929,32930,32931,32932,32933,32934,32935,32936,
+32937,32939,32940,32941,32942,32943,32944,32945,32946,32947,32948,32949,32950,
+32951,32952,32954,32955,32956,32957,32958,32959,32960,32961,32962,32963,32964,
+32965,32966,32967,32969,32970,32971,32972,32973,32974,32975,32976,32977,32978,
+32979,32980,32981,32982,32984,32985,32986,32987,32988,32989,32990,32991,32992,
+32993,32994,32995,32996,32997,32999,33000,33001,33002,33003,33004,33005,33006,
+33007,33008,33009,33010,33011,33012,33014,33015,33016,33017,33018,33019,33020,
+33021,33022,33023,33024,33025,33026,33027,33029,33030,33031,33032,33033,33034,
+33035,33036,33037,33038,33039,33040,33041,33042,33043,33045,33046,33047,33048,
+33049,33050,33051,33052,33053,33054,33055,33056,33057,33058,33060,33061,33062,
+33063,33064,33065,33066,33067,33068,33069,33070,33071,33072,33073,33074,33076,
+33077,33078,33079,33080,33081,33082,33083,33084,33085,33086,33087,33088,33089,
+33090,33092,33093,33094,33095,33096,33097,33098,33099,33100,33101,33102,33103,
+33104,33105,33106,33108,33109,33110,33111,33112,33113,33114,33115,33116,33117,
+33118,33119,33120,33121,33122,33124,33125,33126,33127,33128,33129,33130,33131,
+33132,33133,33134,33135,33136,33137,33138,33140,33141,33142,33143,33144,33145,
+33146,33147,33148,33149,33150,33151,33152,33153,33154,33155,33157,33158,33159,
+33160,33161,33162,33163,33164,33165,33166,33167,33168,33169,33170,33171,33173,
+33174,33175,33176,33177,33178,33179,33180,33181,33182,33183,33184,33185,33186,
+33187,33188,33190,33191,33192,33193,33194,33195,33196,33197,33198,33199,33200,
+33201,33202,33203,33204,33205,33207,33208,33209,33210,33211,33212,33213,33214,
+33215,33216,33217,33218,33219,33220,33221,33222,33224,33225,33226,33227,33228,
+33229,33230,33231,33232,33233,33234,33235,33236,33237,33238,33239,33241,33242,
+33243,33244,33245,33246,33247,33248,33249,33250,33251,33252,33253,33254,33255,
+33256,33257,33259,33260,33261,33262,33263,33264,33265,33266,33267,33268,33269,
+33270,33271,33272,33273,33274,33276,33277,33278,33279,33280,33281,33282,33283,
+33284,33285,33286,33287,33288,33289,33290,33291,33292,33294,33295,33296,33297,
+33298,33299,33300,33301,33302,33303,33304,33305,33306,33307,33308,33309,33310,
+33312,33313,33314,33315,33316,33317,33318,33319,33320,33321,33322,33323,33324,
+33325,33326,33327,33328,33329,33331,33332,33333,33334,33335,33336,33337,33338,
+33339,33340,33341,33342,33343,33344,33345,33346,33347,33349,33350,33351,33352,
+33353,33354,33355,33356,33357,33358,33359,33360,33361,33362,33363,33364,33365,
+33366,33368,33369,33370,33371,33372,33373,33374,33375,33376,33377,33378,33379,
+33380,33381,33382,33383,33384,33385,33387,33388,33389,33390,33391,33392,33393,
+33394,33395,33396,33397,33398,33399,33400,33401,33402,33403,33404,33406,33407,
+33408,33409,33410,33411,33412,33413,33414,33415,33416,33417,33418,33419,33420,
+33421,33422,33423,33424,33426,33427,33428,33429,33430,33431,33432,33433,33434,
+33435,33436,33437,33438,33439,33440,33441,33442,33443,33445,33446,33447,33448,
+33449,33450,33451,33452,33453,33454,33455,33456,33457,33458,33459,33460,33461,
+33462,33463,33465,33466,33467,33468,33469,33470,33471,33472,33473,33474,33475,
+33476,33477,33478,33479,33480,33481,33482,33483,33484,33486,33487,33488,33489,
+33490,33491,33492,33493,33494,33495,33496,33497,33498,33499,33500,33501,33502,
+33503,33504,33505,33507,33508,33509,33510,33511,33512,33513,33514,33515,33516,
+33517,33518,33519,33520,33521,33522,33523,33524,33525,33526,33528,33529,33530,
+33531,33532,33533,33534,33535,33536,33537,33538,33539,33540,33541,33542,33543,
+33544,33545,33546,33547,33549,33550,33551,33552,33553,33554,33555,33556,33557,
+33558,33559,33560,33561,33562,33563,33564,33565,33566,33567,33568,33569,33571,
+33572,33573,33574,33575,33576,33577,33578,33579,33580,33581,33582,33583,33584,
+33585,33586,33587,33588,33589,33590,33591,33593,33594,33595,33596,33597,33598,
+33599,33600,33601,33602,33603,33604,33605,33606,33607,33608,33609,33610,33611,
+33612,33613,33615,33616,33617,33618,33619,33620,33621,33622,33623,33624,33625,
+33626,33627,33628,33629,33630,33631,33632,33633,33634,33635,33636,33638,33639,
+33640,33641,33642,33643,33644,33645,33646,33647,33648,33649,33650,33651,33652,
+33653,33654,33655,33656,33657,33658,33659,33661,33662,33663,33664,33665,33666,
+33667,33668,33669,33670,33671,33672,33673,33674,33675,33676,33677,33678,33679,
+33680,33681,33682,33683,33685,33686,33687,33688,33689,33690,33691,33692,33693,
+33694,33695,33696,33697,33698,33699,33700,33701,33702,33703,33704,33705,33706,
+33707,33709,33710,33711,33712,33713,33714,33715,33716,33717,33718,33719,33720,
+33721,33722,33723,33724,33725,33726,33727,33728,33729,33730,33731,33732,33734,
+33735,33736,33737,33738,33739,33740,33741,33742,33743,33744,33745,33746,33747,
+33748,33749,33750,33751,33752,33753,33754,33755,33756,33757,33758,33760,33761,
+33762,33763,33764,33765,33766,33767,33768,33769,33770,33771,33772,33773,33774,
+33775,33776,33777,33778,33779,33780,33781,33782,33783,33784,33786,33787,33788,
+33789,33790,33791,33792,33793,33794,33795,33796,33797,33798,33799,33800,33801,
+33802,33803,33804,33805,33806,33807,33808,33809,33810,33812,33813,33814,33815,
+33816,33817,33818,33819,33820,33821,33822,33823,33824,33825,33826,33827,33828,
+33829,33830,33831,33832,33833,33834,33835,33836,33837,33838,33840,33841,33842,
+33843,33844,33845,33846,33847,33848,33849,33850,33851,33852,33853,33854,33855,
+33856,33857,33858,33859,33860,33861,33862,33863,33864,33865,33866,33868,33869,
+33870,33871,33872,33873,33874,33875,33876,33877,33878,33879,33880,33881,33882,
+33883,33884,33885,33886,33887,33888,33889,33890,33891,33892,33893,33894,33895,
+33897,33898,33899,33900,33901,33902,33903,33904,33905,33906,33907,33908,33909,
+33910,33911,33912,33913,33914,33915,33916,33917,33918,33919,33920,33921,33922,
+33923,33924,33925,33927,33928,33929,33930,33931,33932,33933,33934,33935,33936,
+33937,33938,33939,33940,33941,33942,33943,33944,33945,33946,33947,33948,33949,
+33950,33951,33952,33953,33954,33955,33956,33958,33959,33960,33961,33962,33963,
+33964,33965,33966,33967,33968,33969,33970,33971,33972,33973,33974,33975,33976,
+33977,33978,33979,33980,33981,33982,33983,33984,33985,33986,33987,33988,33990,
+33991,33992,33993,33994,33995,33996,33997,33998,33999,34000,34001,34002,34003,
+34004,34005,34006,34007,34008,34009,34010,34011,34012,34013,34014,34015,34016,
+34017,34018,34019,34020,34021,34023,34024,34025,34026,34027,34028,34029,34030,
+34031,34032,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,
+34044,34045,34046,34047,34048,34049,34050,34051,34052,34053,34054,34055,34056,
+34058,34059,34060,34061,34062,34063,34064,34065,34066,34067,34068,34069,34070,
+34071,34072,34073,34074,34075,34076,34077,34078,34079,34080,34081,34082,34083,
+34084,34085,34086,34087,34088,34089,34090,34091,34092,34094,34095,34096,34097,
+34098,34099,34100,34101,34102,34103,34104,34105,34106,34107,34108,34109,34110,
+34111,34112,34113,34114,34115,34116,34117,34118,34119,34120,34121,34122,34123,
+34124,34125,34126,34127,34128,34129,34130,34132,34133,34134,34135,34136,34137,
+34138,34139,34140,34141,34142,34143,34144,34145,34146,34147,34148,34149,34150,
+34151,34152,34153,34154,34155,34156,34157,34158,34159,34160,34161,34162,34163,
+34164,34165,34166,34167,34168,34169,34170,34171,34173,34174,34175,34176,34177,
+34178,34179,34180,34181,34182,34183,34184,34185,34186,34187,34188,34189,34190,
+34191,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34203,
+34204,34205,34206,34207,34208,34209,34210,34211,34212,34213,34214,34216,34217,
+34218,34219,34220,34221,34222,34223,34224,34225,34226,34227,34228,34229,34230,
+34231,34232,34233,34234,34235,34236,34237,34238,34239,34240,34241,34242,34243,
+34244,34245,34246,34247,34248,34249,34250,34251,34252,34253,34254,34255,34256,
+34257,34258,34259,34260,34262,34263,34264,34265,34266,34267,34268,34269,34270,
+34271,34272,34273,34274,34275,34276,34277,34278,34279,34280,34281,34282,34283,
+34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,
+34297,34298,34299,34300,34301,34302,34303,34304,34305,34306,34307,34308,34309,
+34310,34312,34313,34314,34315,34316,34317,34318,34319,34320,34321,34322,34323,
+34324,34325,34326,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,
+34337,34338,34339,34340,34341,34342,34343,34344,34345,34346,34347,34348,34349,
+34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34360,34361,34362,
+34363,34364,34365,34366,34368,34369,34370,34371,34372,34373,34374,34375,34376,
+34377,34378,34379,34380,34381,34382,34383,34384,34385,34386,34387,34388,34389,
+34390,34391,34392,34393,34394,34395,34396,34397,34398,34399,34400,34401,34402,
+34403,34404,34405,34406,34407,34408,34409,34410,34411,34412,34413,34414,34415,
+34416,34417,34418,34419,34420,34421,34422,34423,34424,34425,34426,34427,34428,
+34429,34431,34432,34433,34434,34435,34436,34437,34438,34439,34440,34441,34442,
+34443,34444,34445,34446,34447,34448,34449,34450,34451,34452,34453,34454,34455,
+34456,34457,34458,34459,34460,34461,34462,34463,34464,34465,34466,34467,34468,
+34469,34470,34471,34472,34473,34474,34475,34476,34477,34478,34479,34480,34481,
+34482,34483,34484,34485,34486,34487,34488,34489,34490,34491,34492,34493,34494,
+34495,34496,34497,34498,34499,34500,34501,34502,34503,34504,34506,34507,34508,
+34509,34510,34511,34512,34513,34514,34515,34516,34517,34518,34519,34520,34521,
+34522,34523,34524,34525,34526,34527,34528,34529,34530,34531,34532,34533,34534,
+34535,34536,34537,34538,34539,34540,34541,34542,34543,34544,34545,34546,34547,
+34548,34549,34550,34551,34552,34553,34554,34555,34556,34557,34558,34559,34560,
+34561,34562,34563,34564,34565,34566,34567,34568,34569,34570,34571,34572,34573,
+34574,34575,34576,34577,34578,34579,34580,34581,34582,34583,34584,34585,34586,
+34587,34588,34589,34590,34591,34592,34593,34594,34595,34596,34597,34598,34599,
+34600,34601,34602,34603,34605,34606,34607,34608,34609,34610,34611,34612,34613,
+34614,34615,34616,34617,34618,34619,34620,34621,34622,34623,34624,34625,34626,
+34627,34628,34629,34630,34631,34632,34633,34634,34635,34636,34637,34638,34639,
+34640,34641,34642,34643,34644,34645,34646,34647,34648,34649,34650,34651,34652,
+34653,34654,34655,34656,34657,34658,34659,34660,34661,34662,34663,34664,34665,
+34666,34667,34668,34669,34670,34671,34672,34673,34674,34675,34676,34677,34678,
+34679,34680,34681,34682,34683,34684,34685,34686,34687,34688,34689,34690,34691,
+34692,34693,34694,34695,34696,34697,34698,34699,34700,34701,34702,34703,34704,
+34705,34706,34707,34708,34709,34710,34711,34712,34713,34714,34715,34716,34717,
+34718,34719,34720,34721,34722,34723,34724,34725,34726,34727,34728,34729,34730,
+34731,34732,34733,34734,34735,34736,34737,34738,34739,34740,34741,34742,34743,
+34744,34745,34746,34747,34748,34749,34750,34751,34752,34753,34754,34755,34756,
+34757,34758,34759,34760,34761,34762,34763,34764,34765,34766,34767,34768,34769,
+34770,34771,34772,34773,34774,34775,34776,34777,34778,34779,34780,34781,34782,
+34783,34784,34785,34786,34787,34788,34789,34790,34791,34792,34793,34794,34795,
+34796,34797,34798,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,
+34809,34810,34811,34812,34813,34814,34815,34816,34817,34818,34819,34820,34821,
+34822,34823,34824,34825,34826,34827,34828,34829,34830,34831,34832,34833,34834,
+34835,34836,34837,34838,34839,34840,34841,34842,34843,34844,34845,34846,34847,
+34848,34849,34850,34851,34852,34853,34854,34855,34856,34857,34858,34859,34860,
+34861,34862,34863,34864,34865,34866,34867,34868,34869,34870,34871,34872,34873,
+34874,34875,34876,34877,34878,34879,34880,34881,34882,34883,34884,34885,34886,
+34887,34888,34889,34890,34891,34892,34893,34894,34895,34896,34897,34898,34899,
+34900,34901,34902,34903,34904,34905,34906,34907,34908,34909,34910,34911,34912,
+34913,34914,34915,34916,34917,34918,34919,34920,34921,34922,34923,34924,34925,
+34926,34927,34928,34929,34930,34931,34932,34933,34934,34935,34936,34937,34938,
+34939,34940,34941,34942,34943,34944,34945,34946,34947,34948,34949,34950,34951,
+34952,34953,34954,34955,34956,34957,34958,34959,34960,34961,34962,34963,34964,
+34965,34966,34967,34968,34969,34970,34971,34972,34973,34974,34975,34976,34977,
+34978,34979,34980,34981,34982,34983,34984,34985,34986,34987,34988,34989,34990,
+34991,34992,34993,34994,34995,34996,34997,34998,34999,35000,35001,35002,35003,
+35004,35005,35006,35007,35008,35009,35010,35011,35012,35013,35014,35015,35016,
+35017,35018,35019,35020,35021,35022,35023,35024,35025,35026,35027,35028,35029,
+35030,35031,35032,35033,35034,35035,35036,35037,35038,35039,35040,35041,35042,
+35043,35044,35045,35046,35047,35048,35049,35050,35051,35052,35053,35054,35055,
+35056,35057,35058,35059,35060,35061,35062,35062,35063,35064,35065,35066,35067,
+35068,35069,35070,35071,35072,35073,35074,35075,35076,35077,35078,35079,35080,
+35081,35082,35083,35084,35085,35086,35087,35088,35089,35090,35091,35092,35093,
+35094,35095,35096,35097,35098,35099,35100,35101,35102,35103,35104,35105,35106,
+35107,35108,35109,35110,35111,35112,35113,35114,35115,35116,35117,35118,35119,
+35120,35121,35122,35123,35124,35125,35126,35127,35128,35129,35130,35131,35132,
+35133,35134,35135,35136,35137,35138,35139,35140,35141,35142,35143,35144,35145,
+35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,
+35159,35160,35160,35161,35162,35163,35164,35165,35166,35167,35168,35169,35170,
+35171,35172,35173,35174,35175,35176,35177,35178,35179,35180,35181,35182,35183,
+35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35195,35196,
+35197,35198,35199,35200,35201,35202,35203,35204,35205,35206,35207,35208,35209,
+35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,
+35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,35234,35235,
+35236,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,
+35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,
+35261,35262,35263,35264,35265,35266,35267,35268,35269,35270,35271,35272,35273,
+35274,35275,35276,35277,35278,35279,35280,35281,35282,35283,35284,35285,35286,
+35287,35288,35289,35290,35291,35292,35293,35294,35295,35296,35297,35298,35299,
+35299,35300,35301,35302,35303,35304,35305,35306,35307,35308,35309,35310,35311,
+35312,35313,35314,35315,35316,35317,35318,35319,35320,35321,35322,35323,35324,
+35325,35326,35327,35328,35329,35330,35331,35332,35333,35334,35335,35336,35337,
+35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,
+35351,35352,35353,35354,35354,35355,35356,35357,35358,35359,35360,35361,35362,
+35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,
+35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,
+35389,35390,35391,35392,35393,35394,35395,35396,35397,35398,35399,35400,35401,
+35402,35403,35404,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,
+35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,
+35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,
+35440,35441,35442,35443,35444,35445,35446,35447,35448,35449,35450,35450,35451,
+35452,35453,35454,35455,35456,35457,35458,35459,35460,35461,35462,35463,35464,
+35465,35466,35467,35468,35469,35470,35471,35472,35473,35474,35475,35476,35477,
+35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,
+35491,35492,35493,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,
+35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,
+35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,
+35529,35530,35531,35532,35533,35533,35534,35535,35536,35537,35538,35539,35540,
+35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,
+35554,35555,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,
+35567,35568,35569,35570,35571,35571,35572,35573,35574,35575,35576,35577,35578,
+35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35591,
+35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,
+35605,35606,35607,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,
+35617,35618,35619,35620,35621,35622,35623,35624,35625,35626,35627,35628,35629,
+35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,
+35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,35654,
+35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,
+35668,35669,35670,35671,35672,35673,35674,35675,35675,35676,35677,35678,35679,
+35680,35681,35682,35683,35684,35685,35686,35687,35688,35689,35690,35691,35692,
+35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,
+35706,35707,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,
+35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,
+35731,35732,35733,35734,35735,35736,35737,35738,35738,35739,35740,35741,35742,
+35743,35744,35745,35746,35747,35748,35749,35750,35751,35752,35753,35754,35755,
+35756,35757,35758,35759,35760,35761,35762,35763,35764,35765,35766,35767,35767,
+35768,35769,35770,35771,35772,35773,35774,35775,35776,35777,35778,35779,35780,
+35781,35782,35783,35784,35785,35786,35787,35788,35789,35790,35791,35792,35793,
+35794,35795,35796,35796,35797,35798,35799,35800,35801,35802,35803,35804,35805,
+35806,35807,35808,35809,35810,35811,35812,35813,35814,35815,35816,35817,35818,
+35819,35820,35821,35822,35823,35824,35824,35825,35826,35827,35828,35829,35830,
+35831,35832,35833,35834,35835,35836,35837,35838,35839,35840,35841,35842,35843,
+35844,35845,35846,35847,35848,35849,35850,35851,35851,35852,35853,35854,35855,
+35856,35857,35858,35859,35860,35861,35862,35863,35864,35865,35866,35867,35868,
+35869,35870,35871,35872,35873,35874,35875,35876,35877,35878,35878,35879,35880,
+35881,35882,35883,35884,35885,35886,35887,35888,35889,35890,35891,35892,35893,
+35894,35895,35896,35897,35898,35899,35900,35901,35902,35903,35903,35904,35905,
+35906,35907,35908,35909,35910,35911,35912,35913,35914,35915,35916,35917,35918,
+35919,35920,35921,35922,35923,35924,35925,35926,35927,35928,35929,35929,35930,
+35931,35932,35933,35934,35935,35936,35937,35938,35939,35940,35941,35942,35943,
+35944,35945,35946,35947,35948,35949,35950,35951,35952,35953,35953,35954,35955,
+35956,35957,35958,35959,35960,35961,35962,35963,35964,35965,35966,35967,35968,
+35969,35970,35971,35972,35973,35974,35975,35976,35977,35977,35978,35979,35980,
+35981,35982,35983,35984,35985,35986,35987,35988,35989,35990,35991,35992,35993,
+35994,35995,35996,35997,35998,35999,36000,36001,36001,36002,36003,36004,36005,
+36006,36007,36008,36009,36010,36011,36012,36013,36014,36015,36016,36017,36018,
+36019,36020,36021,36022,36023,36024,36024,36025,36026,36027,36028,36029,36030,
+36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,
+36044,36045,36046,36047,36047,36048,36049,36050,36051,36052,36053,36054,36055,
+36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,
+36069,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,
+36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36091,36092,
+36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,
+36106,36107,36108,36109,36110,36111,36112,36113,36113,36114,36115,36116,36117,
+36118,36119,36120,36121,36122,36123,36124,36125,36126,36127,36128,36129,36130,
+36131,36132,36133,36134,36134,36135,36136,36137,36138,36139,36140,36141,36142,
+36143,36144,36145,36146,36147,36148,36149,36150,36151,36152,36153,36154,36154,
+36155,36156,36157,36158,36159,36160,36161,36162,36163,36164,36165,36166,36167,
+36168,36169,36170,36171,36172,36173,36174,36175,36175,36176,36177,36178,36179,
+36180,36181,36182,36183,36184,36185,36186,36187,36188,36189,36190,36191,36192,
+36193,36194,36195,36195,36196,36197,36198,36199,36200,36201,36202,36203,36204,
+36205,36206,36207,36208,36209,36210,36211,36212,36213,36214,36215,36215,36216,
+36217,36218,36219,36220,36221,36222,36223,36224,36225,36226,36227,36228,36229,
+36230,36231,36232,36233,36234,36235,36235,36236,36237,36238,36239,36240,36241,
+36242,36243,36244,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,
+36254,36255,36256,36257,36258,36259,36260,36261,36262,36263,36264,36265,36266,
+36267,36268,36269,36270,36271,36272,36273,36273,36274,36275,36276,36277,36278,
+36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,36289,36290,36291,
+36292,36292,36293,36294,36295,36296,36297,36298,36299,36300,36301,36302,36303,
+36304,36305,36306,36307,36308,36309,36310,36310,36311,36312,36313,36314,36315,
+36316,36317,36318,36319,36320,36321,36322,36323,36324,36325,36326,36327,36328,
+36329,36329,36330,36331,36332,36333,36334,36335,36336,36337,36338,36339,36340,
+36341,36342,36343,36344,36345,36346,36347,36347,36348,36349,36350,36351,36352,
+36353,36354,36355,36356,36357,36358,36359,36360,36361,36362,36363,36364,36365,
+36365,36366,36367,36368,36369,36370,36371,36372,36373,36374,36375,36376,36377,
+36378,36379,36380,36381,36382,36382,36383,36384,36385,36386,36387,36388,36389,
+36390,36391,36392,36393,36394,36395,36396,36397,36398,36399,36400,36400,36401,
+36402,36403,36404,36405,36406,36407,36408,36409,36410,36411,36412,36413,36414,
+36415,36416,36417,36417,36418,36419,36420,36421,36422,36423,36424,36425,36426,
+36427,36428,36429,36430,36431,36432,36433,36434,36434,36435,36436,36437,36438,
+36439,36440,36441,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,
+36451,36452,36453,36454,36455,36456,36457,36458,36459,36460,36461,36462,36463,
+36464,36465,36466,36467,36468,36468,36469,36470,36471,36472,36473,36474,36475,
+36476,36477,36478,36479,36480,36481,36482,36483,36484,36484,36485,36486,36487,
+36488,36489,36490,36491,36492,36493,36494,36495,36496,36497,36498,36499,36500,
+36501,36501,36502,36503,36504,36505,36506,36507,36508,36509,36510,36511,36512,
+36513,36514,36515,36516,36517,36517,36518,36519,36520,36521,36522,36523,36524,
+36525,36526,36527,36528,36529,36530,36531,36532,36533,36533,36534,36535,36536,
+36537,36538,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,
+36549,36550,36551,36552,36553,36554,36555,36556,36557,36558,36559,36560,36561,
+36562,36563,36564,36565,36565,36566,36567,36568,36569,36570,36571,36572,36573,
+36574,36575,36576,36577,36578,36579,36580,36581,36581,36582,36583,36584,36585,
+36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36596,36597,
+36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,
+36611,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,
+36623,36624,36625,36626,36627,36627,36628,36629,36630,36631,36632,36633,36634,
+36635,36636,36637,36638,36639,36640,36641,36642,36642,36643,36644,36645,36646,
+36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36657,36658,
+36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,
+36672,36672,36673,36674,36675,36676,36677,36678,36679,36680,36681,36682,36683,
+36684,36685,36686,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,
+36696,36697,36698,36699,36700,36701,36701,36702,36703,36704,36705,36706,36707,
+36708,36709,36710,36711,36712,36713,36714,36715,36715,36716,36717,36718,36719,
+36720,36721,36722,36723,36724,36725,36726,36727,36728,36729,36730,36730,36731,
+36732,36733,36734,36735,36736,36737,36738,36739,36740,36741,36742,36743,36744,
+36744,36745,36746,36747,36748,36749,36750,36751,36752,36753,36754,36755,36756,
+36757,36758,36758,36759,36760,36761,36762,36763,36764,36765,36766,36767,36768,
+36769,36770,36771,36772,36772,36773,36774,36775,36776,36777,36778,36779,36780,
+36781,36782,36783,36784,36785,36786,36786,36787,36788,36789,36790,36791,36792,
+36793,36794,36795,36796,36797,36798,36799,36800,36800,36801,36802,36803,36804,
+36805,36806,36807,36808,36809,36810,36811,36812,36813,36814,36814,36815,36816,
+36817,36818,36819,36820,36821,36822,36823,36824,36825,36826,36827,36828,36828,
+36829,36830,36831,36832,36833,36834,36835,36836,36837,36838,36839,36840,36841,
+36841,36842,36843,36844,36845,36846,36847,36848,36849,36850,36851,36852,36853,
+36854,36855,36855,36856,36857,36858,36859,36860,36861,36862,36863,36864,36865,
+36866,36867,36868,36868,36869,36870,36871,36872,36873,36874,36875,36876,36877,
+36878,36879,36880,36881,36881,36882,36883,36884,36885,36886,36887,36888,36889,
+36890,36891,36892,36893,36894,36895,36895,36896,36897,36898,36899,36900,36901,
+36902,36903,36904,36905,36906,36907,36908,36908,36909,36910,36911,36912,36913,
+36914,36915,36916,36917,36918,36919,36920,36921,36921,36922,36923,36924,36925,
+36926,36927,36928,36929,36930,36931,36932,36933,36934,36934,36935,36936,36937,
+36938,36939,36940,36941,36942,36943,36944,36945,36946,36947,36947,36948,36949,
+36950,36951,36952,36953,36954,36955,36956,36957,36958,36959,36960,36960,36961,
+36962,36963,36964,36965,36966,36967,36968,36969,36970,36971,36972,36972,36973,
+36974,36975,36976,36977,36978,36979,36980,36981,36982,36983,36984,36985,36985,
+36986,36987,36988,36989,36990,36991,36992,36993,36994,36995,36996,36997,36998,
+36998,36999,37000,37001,37002,37003,37004,37005,37006,37007,37008,37009,37010,
+37010,37011,37012,37013,37014,37015,37016,37017,37018,37019,37020,37021,37022,
+37022,37023,37024,37025,37026,37027,37028,37029,37030,37031,37032,37033,37034,
+37035,37035,37036,37037,37038,37039,37040,37041,37042,37043,37044,37045,37046,
+37047,37047,37048,37049,37050,37051,37052,37053,37054,37055,37056,37057,37058,
+37059,37059,37060,37061,37062,37063,37064,37065,37066,37067,37068,37069,37070,
+37071,37072,37072,37073,37074,37075,37076,37077,37078,37079,37080,37081,37082,
+37083,37084,37084,37085,37086,37087,37088,37089,37090,37091,37092,37093,37094,
+37095,37096,37096,37097,37098,37099,37100,37101,37102,37103,37104,37105,37106,
+37107,37108,37108,37109,37110,37111,37112,37113,37114,37115,37116,37117,37118,
+37119,37120,37120,37121,37122,37123,37124,37125,37126,37127,37128,37129,37130,
+37131,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,
+37143,37143,37144,37145,37146,37147,37148,37149,37150,37151,37152,37153,37154,
+37155,37155,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,
+37167,37167,37168,37169,37170,37171,37172,37173,37174,37175,37176,37177,37178,
+37178,37179,37180,37181,37182,37183,37184,37185,37186,37187,37188,37189,37190,
+37190,37191,37192,37193,37194,37195,37196,37197,37198,37199,37200,37201,37201,
+37202,37203,37204,37205,37206,37207,37208,37209,37210,37211,37212,37213,37213,
+37214,37215,37216,37217,37218,37219,37220,37221,37222,37223,37224,37224,37225,
+37226,37227,37228,37229,37230,37231,37232,37233,37234,37235,37235,37236,37237,
+37238,37239,37240,37241,37242,37243,37244,37245,37246,37247,37247,37248,37249,
+37250,37251,37252,37253,37254,37255,37256,37257,37258,37258,37259,37260,37261,
+37262,37263,37264,37265,37266,37267,37268,37269,37269,37270,37271,37272,37273,
+37274,37275,37276,37277,37278,37279,37280,37280,37281,37282,37283,37284,37285,
+37286,37287,37288,37289,37290,37291,37291,37292,37293,37294,37295,37296,37297,
+37298,37299,37300,37301,37302,37302,37303,37304,37305,37306,37307,37308,37309,
+37310,37311,37312,37313,37313,37314,37315,37316,37317,37318,37319,37320,37321,
+37322,37323,37324,37324,37325,37326,37327,37328,37329,37330,37331,37332,37333,
+37334,37335,37335,37336,37337,37338,37339,37340,37341,37342,37343,37344,37345,
+37346,37346,37347,37348,37349,37350,37351,37352,37353,37354,37355,37356,37356,
+37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37367,37368,
+37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37378,37379,37380,
+37381,37382,37383,37384,37385,37386,37387,37388,37388,37389,37390,37391,37392,
+37393,37394,37395,37396,37397,37398,37399,37399,37400,37401,37402,37403,37404,
+37405,37406,37407,37408,37409,37410,37410,37411,37412,37413,37414,37415,37416,
+37417,37418,37419,37420,37420,37421,37422,37423,37424,37425,37426,37427,37428,
+37429,37430,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,
+37441,37441,37442,37443,37444,37445,37446,37447,37448,37449,37450,37451,37451,
+37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37462,37463,
+37464,37465,37466,37467,37468,37469,37470,37471,37472,37472,37473,37474,37475,
+37476,37477,37478,37479,37480,37481,37482,37482,37483,37484,37485,37486,37487,
+37488,37489,37490,37491,37492,37492,37493,37494,37495,37496,37497,37498,37499,
+37500,37501,37502,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,
+37512,37513,37513,37514,37515,37516,37517,37518,37519,37520,37521,37522,37523,
+37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37533,37534,
+37535,37536,37537,37538,37539,37540,37541,37542,37543,37543,37544,37545,37546,
+37547,37548,37549,37550,37551,37552,37553,37553,37554,37555,37556,37557,37558,
+37559,37560,37561,37562,37563,37563,37564,37565,37566,37567,37568,37569,37570,
+37571,37572,37573,37573,37574,37575,37576,37577,37578,37579,37580,37581,37582,
+37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37592,37593,
+37594,37595,37596,37597,37598,37599,37600,37601,37602,37602,37603,37604,37605,
+37606,37607,37608,37609,37610,37611,37612,37612,37613,37614,37615,37616,37617,
+37618,37619,37620,37621,37622,37622,37623,37624,37625,37626,37627,37628,37629,
+37630,37631,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,
+37641,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37651,37652,
+37653,37654,37655,37656,37657,37658,37659,37660,37660,37661,37662,37663,37664,
+37665,37666,37667,37668,37669,37670,37670,37671,37672,37673,37674,37675,37676,
+37677,37678,37679,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,
+37689,37689,37690,37691,37692,37693,37694,37695,37696,37697,37698,37698,37699,
+37700,37701,37702,37703,37704,37705,37706,37707,37708,37708,37709,37710,37711,
+37712,37713,37714,37715,37716,37717,37717,37718,37719,37720,37721,37722,37723,
+37724,37725,37726,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,
+37736,37736,37737,37738,37739,37740,37741,37742,37743,37744,37745,37745,37746,
+37747,37748,37749,37750,37751,37752,37753,37754,37754,37755,37756,37757,37758,
+37759,37760,37761,37762,37763,37764,37764,37765,37766,37767,37768,37769,37770,
+37771,37772,37773,37773,37774,37775,37776,37777,37778,37779,37780,37781,37782,
+37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37791,37792,37793,
+37794,37795,37796,37797,37798,37799,37800,37800,37801,37802,37803,37804,37805,
+37806,37807,37808,37809,37809,37810,37811,37812,37813,37814,37815,37816,37817,
+37818,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37827,37828,
+37829,37830,37831,37832,37833,37834,37835,37836,37836,37837,37838,37839,37840,
+37841,37842,37843,37844,37845,37845,37846,37847,37848,37849,37850,37851,37852,
+37853,37854,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37863,
+37864,37865,37866,37867,37868,37869,37870,37871,37872,37872,37873,37874,37875,
+37876,37877,37878,37879,37880,37881,37881,37882,37883,37884,37885,37886,37887,
+37888,37889,37890,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,
+37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37908,37909,37910,
+37911,37912,37913,37914,37915,37916,37916,37917,37918,37919,37920,37921,37922,
+37923,37924,37925,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,
+37934,37935,37936,37937,37938,37939,37940,37941,37942,37943,37943,37944,37945,
+37946,37947,37948,37949,37950,37951,37951,37952,37953,37954,37955,37956,37957,
+37958,37959,37960,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,
+37969,37970,37971,37972,37973,37974,37975,37976,37977,37977,37978,37979,37980,
+37981,37982,37983,37984,37985,37986,37986,37987,37988,37989,37990,37991,37992,
+37993,37994,37994,37995,37996,37997,37998,37999,38000,38001,38002,38003,38003,
+38004,38005,38006,38007,38008,38009,38010,38011,38011,38012,38013,38014,38015,
+38016,38017,38018,38019,38020,38020,38021,38022,38023,38024,38025,38026,38027,
+38028,38028,38029,38030,38031,38032,38033,38034,38035,38036,38037,38037,38038,
+38039,38040,38041,38042,38043,38044,38045,38045,38046,38047,38048,38049,38050,
+38051,38052,38053,38054,38054,38055,38056,38057,38058,38059,38060,38061,38062,
+38062,38063,38064,38065,38066,38067,38068,38069,38070,38070,38071,38072,38073,
+38074,38075,38076,38077,38078,38079,38079,38080,38081,38082,38083,38084,38085,
+38086,38087,38087,38088,38089,38090,38091,38092,38093,38094,38095,38095,38096,
+38097,38098,38099,38100,38101,38102,38103,38103,38104,38105,38106,38107,38108,
+38109,38110,38111,38112,38112,38113,38114,38115,38116,38117,38118,38119,38120,
+38120,38121,38122,38123,38124,38125,38126,38127,38128,38128,38129,38130,38131,
+38132,38133,38134,38135,38136,38136,38137,38138,38139,38140,38141,38142,38143,
+38144,38144,38145,38146,38147,38148,38149,38150,38151,38152,38153,38153,38154,
+38155,38156,38157,38158,38159,38160,38161,38161,38162,38163,38164,38165,38166,
+38167,38168,38169,38169,38170,38171,38172,38173,38174,38175,38176,38177,38177,
+38178,38179,38180,38181,38182,38183,38184,38185,38185,38186,38187,38188,38189,
+38190,38191,38192,38193,38193,38194,38195,38196,38197,38198,38199,38200,38201,
+38201,38202,38203,38204,38205,38206,38207,38208,38209,38209,38210,38211,38212,
+38213,38214,38215,38216,38217,38217,38218,38219,38220,38221,38222,38223,38224,
+38225,38225,38226,38227,38228,38229,38230,38231,38232,38233,38233,38234,38235,
+38236,38237,38238,38239,38240,38241,38241,38242,38243,38244,38245,38246,38247,
+38248,38249,38249,38250,38251,38252,38253,38254,38255,38256,38257,38257,38258,
+38259,38260,38261,38262,38263,38264,38265,38265,38266,38267,38268,38269,38270,
+38271,38272,38272,38273,38274,38275,38276,38277,38278,38279,38280,38280,38281,
+38282,38283,38284,38285,38286,38287,38288,38288,38289,38290,38291,38292,38293,
+38294,38295,38296,38296,38297,38298,38299,38300,38301,38302,38303,38304,38304,
+38305,38306,38307,38308,38309,38310,38311,38311,38312,38313,38314,38315,38316,
+38317,38318,38319,38319,38320,38321,38322,38323,38324,38325,38326,38327,38327,
+38328,38329,38330,38331,38332,38333,38334,38335,38335,38336,38337,38338,38339,
+38340,38341,38342,38342,38343,38344,38345,38346,38347,38348,38349,38350,38350,
+38351,38352,38353,38354,38355,38356,38357,38358,38358,38359,38360,38361,38362,
+38363,38364,38365,38365,38366,38367,38368,38369,38370,38371,38372,38373,38373,
+38374,38375,38376,38377,38378,38379,38380,38381,38381,38382,38383,38384,38385,
+38386,38387,38388,38388,38389,38390,38391,38392,38393,38394,38395,38396,38396,
+38397,38398,38399,38400,38401,38402,38403,38403,38404,38405,38406,38407,38408,
+38409,38410,38411,38411,38412,38413,38414,38415,38416,38417,38418,38418,38419,
+38420,38421,38422,38423,38424,38425,38426,38426,38427,38428,38429,38430,38431,
+38432,38433,38433,38434,38435,38436,38437,38438,38439,38440,38441,38441,38442,
+38443,38444,38445,38446,38447,38448,38448,38449,38450,38451,38452,38453,38454,
+38455,38456,38456,38457,38458,38459,38460,38461,38462,38463,38463,38464,38465,
+38466,38467,38468,38469,38470,38471,38471,38472,38473,38474,38475,38476,38477,
+38478,38478,38479,38480,38481,38482,38483,38484,38485,38485,38486,38487,38488,
+38489,38490,38491,38492,38493,38493,38494,38495,38496,38497,38498,38499,38500,
+38500,38501,38502,38503,38504,38505,38506,38507,38507,38508,38509,38510,38511,
+38512,38513,38514,38515,38515,38516,38517,38518,38519,38520,38521,38522,38522,
+38523,38524,38525,38526,38527,38528,38529,38529,38530,38531,38532,38533,38534,
+38535,38536,38537,38537,38538,38539,38540,38541,38542,38543,38544,38544,38545,
+38546,38547,38548,38549,38550,38551,38551,38552,38553,38554,38555,38556,38557,
+38558,38558,38559,38560,38561,38562,38563,38564,38565,38566,38566,38567,38568,
+38569,38570,38571,38572,38573,38573,38574,38575,38576,38577,38578,38579,38580,
+38580,38581,38582,38583,38584,38585,38586,38587,38587,38588,38589,38590,38591,
+38592,38593,38594,38594,38595,38596,38597,38598,38599,38600,38601,38602,38602,
+38603,38604,38605,38606,38607,38608,38609,38609,38610,38611,38612,38613,38614,
+38615,38616,38616,38617,38618,38619,38620,38621,38622,38623,38623,38624,38625,
+38626,38627,38628,38629,38630,38630,38631,38632,38633,38634,38635,38636,38637,
+38637,38638,38639,38640,38641,38642,38643,38644,38644,38645,38646,38647,38648,
+38649,38650,38651,38651,38652,38653,38654,38655,38656,38657,38658,38658,38659,
+38660,38661,38662,38663,38664,38665,38665,38666,38667,38668,38669,38670,38671,
+38672,38672,38673,38674,38675,38676,38677,38678,38679,38679,38680,38681,38682,
+38683,38684,38685,38686,38686,38687,38688,38689,38690,38691,38692,38693,38693,
+38694,38695,38696,38697,38698,38699,38700,38700,38701,38702,38703,38704,38705,
+38706,38707,38707,38708,38709,38710,38711,38712,38713,38714,38714,38715,38716,
+38717,38718,38719,38720,38721,38721,38722,38723,38724,38725,38726,38727,38728,
+38728,38729,38730,38731,38732,38733,38734,38735,38735,38736,38737,38738,38739,
+38740,38741,38742,38742,38743,38744,38745,38746,38747,38748,38749,38749,38750,
+38751,38752,38753,38754,38755,38756,38756,38757,38758,38759,38760,38761,38762,
+38762,38763,38764,38765,38766,38767,38768,38769,38769,38770,38771,38772,38773,
+38774,38775,38776,38776,38777,38778,38779,38780,38781,38782,38783,38783,38784,
+38785,38786,38787,38788,38789,38790,38790,38791,38792,38793,38794,38795,38796,
+38797,38797,38798,38799,38800,38801,38802,38803,38803,38804,38805,38806,38807,
+38808,38809,38810,38810,38811,38812,38813,38814,38815,38816,38817,38817,38818,
+38819,38820,38821,38822,38823,38824,38824,38825,38826,38827,38828,38829,38830,
+38830,38831,38832,38833,38834,38835,38836,38837,38837,38838,38839,38840,38841,
+38842,38843,38844,38844,38845,38846,38847,38848,38849,38850,38850,38851,38852,
+38853,38854,38855,38856,38857,38857,38858,38859,38860,38861,38862,38863,38864,
+38864,38865,38866,38867,38868,38869,38870,38871,38871,38872,38873,38874,38875,
+38876,38877,38877,38878,38879,38880,38881,38882,38883,38884,38884,38885,38886,
+38887,38888,38889,38890,38890,38891,38892,38893,38894,38895,38896,38897,38897,
+38898,38899,38900,38901,38902,38903,38904,38904,38905,38906,38907,38908,38909,
+38910,38910,38911,38912,38913,38914,38915,38916,38917,38917,38918,38919,38920,
+38921,38922,38923,38923,38924,38925,38926,38927,38928,38929,38930,38930,38931,
+38932,38933,38934,38935,38936,38937,38937,38938,38939,38940,38941,38942,38943,
+38943,38944,38945,38946,38947,38948,38949,38950,38950,38951,38952,38953,38954,
+38955,38956,38956,38957,38958,38959,38960,38961,38962,38963,38963,38964,38965,
+38966,38967,38968,38969,38969,38970,38971,38972,38973,38974,38975,38976,38976,
+38977,38978,38979,38980,38981,38982,38982,38983,38984,38985,38986,38987,38988,
+38989,38989,38990,38991,38992,38993,38994,38995,38995,38996,38997,38998,38999,
+39000,39001,39002,39002,39003,39004,39005,39006,39007,39008,39008,39009,39010,
+39011,39012,39013,39014,39014,39015,39016,39017,39018,39019,39020,39021,39021,
+39022,39023,39024,39025,39026,39027,39027,39028,39029,39030,39031,39032,39033,
+39034,39034,39035,39036,39037,39038,39039,39040,39040,39041,39042,39043,39044,
+39045,39046,39046,39047,39048,39049,39050,39051,39052,39053,39053,39054,39055,
+39056,39057,39058,39059,39059,39060,39061,39062,39063,39064,39065,39066,39066,
+39067,39068,39069,39070,39071,39072,39072,39073,39074,39075,39076,39077,39078,
+39078,39079,39080,39081,39082,39083,39084,39085,39085,39086,39087,39088,39089,
+39090,39091,39091,39092,39093,39094,39095,39096,39097,39097,39098,39099,39100,
+39101,39102,39103,39104,39104,39105,39106,39107,39108,39109,39110,39110,39111,
+39112,39113,39114,39115,39116,39116,39117,39118,39119,39120,39121,39122,39122,
+39123,39124,39125,39126,39127,39128,39129,39129,39130,39131,39132,39133,39134,
+39135,39135,39136,39137,39138,39139,39140,39141,39141,39142,39143,39144,39145,
+39146,39147,39147,39148,39149,39150,39151,39152,39153,39154,39154,39155,39156,
+39157,39158,39159,39160,39160,39161,39162,39163,39164,39165,39166,39166,39167,
+39168,39169,39170,39171,39172,39172,39173,39174,39175,39176,39177,39178,39178,
+39179,39180,39181,39182,39183,39184,39185,39185,39186,39187,39188,39189,39190,
+39191,39191,39192,39193,39194,39195,39196,39197,39197,39198,39199,39200,39201,
+39202,39203,39203,39204,39205,39206,39207,39208,39209,39209,39210,39211,39212,
+39213,39214,39215,39215,39216,39217,39218,39219,39220,39221,39221,39222,39223,
+39224,39225,39226,39227,39228,39228,39229,39230,39231,39232,39233,39234,39234,
+39235,39236,39237,39238,39239,39240,39240,39241,39242,39243,39244,39245,39246,
+39246,39247,39248,39249,39250,39251,39252,39252,39253,39254,39255,39256,39257,
+39258,39258,39259,39260,39261,39262,39263,39264,39264,39265,39266,39267,39268,
+39269,39270,39270,39271,39272,39273,39274,39275,39276,39276,39277,39278,39279,
+39280,39281,39282,39282,39283,39284,39285,39286,39287,39288,39288,39289,39290,
+39291,39292,39293,39294,39294,39295,39296,39297,39298,39299,39300,39300,39301,
+39302,39303,39304,39305,39306,39306,39307,39308,39309,39310,39311,39312,39312,
+39313,39314,39315,39316,39317,39318,39318,39319,39320,39321,39322,39323,39324,
+39324,39325,39326,39327,39328,39329,39330,39330,39331,39332,39333,39334,39335,
+39336,39336,39337,39338,39339,39340,39341,39342,39342,39343,39344,39345,39346,
+39347,39348,39348,39349,39350,39351,39352,39353,39354,39354,39355,39356,39357,
+39358,39359,39360,39360,39361,39362,39363,39364,39365,39366,39366,39367,39368,
+39369,39370,39371,39372,39372,39373,39374,39375,39376,39377,39378,39378,39379,
+39380,39381,39382,39383,39384,39384,39385,39386,39387,39388,39389,39389,39390,
+39391,39392,39393,39394,39395,39395,39396,39397,39398,39399,39400,39401,39401,
+39402,39403,39404,39405,39406,39407,39407,39408,39409,39410,39411,39412,39413,
+39413,39414,39415,39416,39417,39418,39419,39419,39420,39421,39422,39423,39424,
+39425,39425,39426,39427,39428,39429,39430,39430,39431,39432,39433,39434,39435,
+39436,39436,39437,39438,39439,39440,39441,39442,39442,39443,39444,39445,39446,
+39447,39448,39448,39449,39450,39451,39452,39453,39454,39454,39455,39456,39457,
+39458,39459,39460,39460,39461,39462,39463,39464,39465,39465,39466,39467,39468,
+39469,39470,39471,39471,39472,39473,39474,39475,39476,39477,39477,39478,39479,
+39480,39481,39482,39483,39483,39484,39485,39486,39487,39488,39488,39489,39490,
+39491,39492,39493,39494,39494,39495,39496,39497,39498,39499,39500,39500,39501,
+39502,39503,39504,39505,39506,39506,39507,39508,39509,39510,39511,39511,39512,
+39513,39514,39515,39516,39517,39517,39518,39519,39520,39521,39522,39523,39523,
+39524,39525,39526,39527,39528,39529,39529,39530,39531,39532,39533,39534,39534,
+39535,39536,39537,39538,39539,39540,39540,39541,39542,39543,39544,39545,39546,
+39546,39547,39548,39549,39550,39551,39551,39552,39553,39554,39555,39556,39557,
+39557,39558,39559,39560,39561,39562,39563,39563,39564,39565,39566,39567,39568,
+39568,39569,39570,39571,39572,39573,39574,39574,39575,39576,39577,39578,39579,
+39580,39580,39581,39582,39583,39584,39585,39585,39586,39587,39588,39589,39590,
+39591,39591,39592,39593,39594,39595,39596,39597,39597,39598,39599,39600,39601,
+39602,39602,39603,39604,39605,39606,39607,39608,39608,39609,39610,39611,39612,
+39613,39613,39614,39615,39616,39617,39618,39619,39619,39620,39621,39622,39623,
+39624,39625,39625,39626,39627,39628,39629,39630,39630,39631,39632,39633,39634,
+39635,39636,39636,39637,39638,39639,39640,39641,39641,39642,39643,39644,39645,
+39646,39647,39647,39648,39649,39650,39651,39652,39653,39653,39654,39655,39656,
+39657,39658,39658,39659,39660,39661,39662,39663,39664,39664,39665,39666,39667,
+39668,39669,39669,39670,39671,39672,39673,39674,39675,39675,39676,39677,39678,
+39679,39680,39680,39681,39682,39683,39684,39685,39686,39686,39687,39688,39689,
+39690,39691,39691,39692,39693,39694,39695,39696,39697,39697,39698,39699,39700,
+39701,39702,39702,39703,39704,39705,39706,39707,39708,39708,39709,39710,39711,
+39712,39713,39713,39714,39715,39716,39717,39718,39719,39719,39720,39721,39722,
+39723,39724,39724,39725,39726,39727,39728,39729,39730,39730,39731,39732,39733,
+39734,39735,39735,39736,39737,39738,39739,39740,39741,39741,39742,39743,39744,
+39745,39746,39746,39747,39748,39749,39750,39751,39752,39752,39753,39754,39755,
+39756,39757,39757,39758,39759,39760,39761,39762,39762,39763,39764,39765,39766,
+39767,39768,39768,39769,39770,39771,39772,39773,39773,39774,39775,39776,39777,
+39778,39779,39779,39780,39781,39782,39783,39784,39784,39785,39786,39787,39788,
+39789,39790,39790,39791,39792,39793,39794,39795,39795,39796,39797,39798,39799,
+39800,39800,39801,39802,39803,39804,39805,39806,39806,39807,39808,39809,39810,
+39811,39811,39812,39813,39814,39815,39816,39817,39817,39818,39819,39820,39821,
+39822,39822,39823,39824,39825,39826,39827,39827,39828,39829,39830,39831,39832,
+39833,39833,39834,39835,39836,39837,39838,39838,39839,39840,39841,39842,39843,
+39843,39844,39845,39846,39847,39848,39849,39849,39850,39851,39852,39853,39854,
+39854,39855,39856,39857,39858,39859,39859,39860,39861,39862,39863,39864,39865,
+39865,39866,39867,39868,39869,39870,39870,39871,39872,39873,39874,39875,39875,
+39876,39877,39878,39879,39880,39881,39881,39882,39883,39884,39885,39886,39886,
+39887,39888,39889,39890,39891,39891,39892,39893,39894,39895,39896,39896,39897,
+39898,39899,39900,39901,39902,39902,39903,39904,39905,39906,39907,39907,39908,
+39909,39910,39911,39912,39912,39913,39914,39915,39916,39917,39918,39918,39919,
+39920,39921,39922,39923,39923,39924,39925,39926,39927,39928,39928,39929,39930,
+39931,39932,39933,39933,39934,39935,39936,39937,39938,39939,39939,39940,39941,
+39942,39943,39944,39944,39945,39946,39947,39948,39949,39949,39950,39951,39952,
+39953,39954,39954,39955,39956,39957,39958,39959,39959,39960,39961,39962,39963,
+39964,39965,39965,39966,39967,39968,39969,39970,39970,39971,39972,39973,39974,
+39975,39975,39976,39977,39978,39979,39980,39980,39981,39982,39983,39984,39985,
+39986,39986,39987,39988,39989,39990,39991,39991,39992,39993,39994,39995,39996,
+39996,39997,39998,39999,40000,40001,40001,40002,40003,40004,40005,40006,40006,
+40007,40008,40009,40010,40011,40011,40012,40013,40014,40015,40016,40017,40017,
+40018,40019,40020,40021,40022,40022,40023,40024,40025,40026,40027,40027,40028,
+40029,40030,40031,40032,40032,40033,40034,40035,40036,40037,40037,40038,40039,
+40040,40041,40042,40042,40043,40044,40045,40046,40047,40047,40048,40049,40050,
+40051,40052,40053,40053,40054,40055,40056,40057,40058,40058,40059,40060,40061,
+40062,40063,40063,40064,40065,40066,40067,40068,40068,40069,40070,40071,40072,
+40073,40073,40074,40075,40076,40077,40078,40078,40079,40080,40081,40082,40083,
+40083,40084,40085,40086,40087,40088,40088,40089,40090,40091,40092,40093,40093,
+40094,40095,40096,40097,40098,40099,40099,40100,40101,40102,40103,40104,40104,
+40105,40106,40107,40108,40109,40109,40110,40111,40112,40113,40114,40114,40115,
+40116,40117,40118,40119,40119,40120,40121,40122,40123,40124,40124,40125,40126,
+40127,40128,40129,40129,40130,40131,40132,40133,40134,40134,40135,40136,40137,
+40138,40139,40139,40140,40141,40142,40143,40144,40144,40145,40146,40147,40148,
+40149,40149,40150,40151,40152,40153,40154,40154,40155,40156,40157,40158,40159,
+40159,40160,40161,40162,40163,40164,40164,40165,40166,40167,40168,40169,40169,
+40170,40171,40172,40173,40174,40174,40175,40176,40177,40178,40179,40179,40180,
+40181,40182,40183,40184,40184,40185,40186,40187,40188,40189,40189,40190,40191,
+40192,40193,40194,40194,40195,40196,40197,40198,40199,40199,40200,40201,40202,
+40203,40204,40204,40205,40206,40207,40208,40209,40209,40210,40211,40212,40213,
+40214,40214,40215,40216,40217,40218,40219,40219,40220,40221,40222,40223,40224,
+40224,40225,40226,40227,40228,40229,40229,40230,40231,40232,40233,40234,40234,
+40235,40236,40237,40238,40239,40239,40240,40241,40242,40243,40244,40244,40245,
+40246,40247,40248,40249,40249,40250,40251,40252,40253,40254,40254,40255,40256,
+40257,40258,40259,40259,40260,40261,40262,40263,40263,40264,40265,40266,40267,
+40268,40268,40269,40270,40271,40272,40273,40273,40274,40275,40276,40277,40278,
+40278,40279,40280,40281,40282,40283,40283,40284,40285,40286,40287,40288,40288,
+40289,40290,40291,40292,40293,40293,40294,40295,40296,40297,40298,40298,40299,
+40300,40301,40302,40303,40303,40304,40305,40306,40307,40308,40308,40309,40310,
+40311,40312,40312,40313,40314,40315,40316,40317,40317,40318,40319,40320,40321,
+40322,40322,40323,40324,40325,40326,40327,40327,40328,40329,40330,40331,40332,
+40332,40333,40334,40335,40336,40337,40337,40338,40339,40340,40341,40342,40342,
+40343,40344,40345,40346,40346,40347,40348,40349,40350,40351,40351,40352,40353,
+40354,40355,40356,40356,40357,40358,40359,40360,40361,40361,40362,40363,40364,
+40365,40366,40366,40367,40368,40369,40370,40371,40371,40372,40373,40374,40375,
+40375,40376,40377,40378,40379,40380,40380,40381,40382,40383,40384,40385,40385,
+40386,40387,40388,40389,40390,40390,40391,40392,40393,40394,40395,40395,40396,
+40397,40398,40399,40399,40400,40401,40402,40403,40404,40404,40405,40406,40407,
+40408,40409,40409,40410,40411,40412,40413,40414,40414,40415,40416,40417,40418,
+40419,40419,40420,40421,40422,40423,40423,40424,40425,40426,40427,40428,40428,
+40429,40430,40431,40432,40433,40433,40434,40435,40436,40437,40438,40438,40439,
+40440,40441,40442,40442,40443,40444,40445,40446,40447,40447,40448,40449,40450,
+40451,40452,40452,40453,40454,40455,40456,40457,40457,40458,40459,40460,40461,
+40461,40462,40463,40464,40465,40466,40466,40467,40468,40469,40470,40471,40471,
+40472,40473,40474,40475,40476,40476,40477,40478,40479,40480,40480,40481,40482,
+40483,40484,40485,40485,40486,40487,40488,40489,40490,40490,40491,40492,40493,
+40494,40495,40495,40496,40497,40498,40499,40499,40500,40501,40502,40503,40504,
+40504,40505,40506,40507,40508,40509,40509,40510,40511,40512,40513,40513,40514,
+40515,40516,40517,40518,40518,40519,40520,40521,40522,40523,40523,40524,40525,
+40526,40527,40527,40528,40529,40530,40531,40532,40532,40533,40534,40535,40536,
+40537,40537,40538,40539,40540,40541,40542,40542,40543,40544,40545,40546,40546,
+40547,40548,40549,40550,40551,40551,40552,40553,40554,40555,40556,40556,40557,
+40558,40559,40560,40560,40561,40562,40563,40564,40565,40565,40566,40567,40568,
+40569,40569,40570,40571,40572,40573,40574,40574,40575,40576,40577,40578,40579,
+40579,40580,40581,40582,40583,40583,40584,40585,40586,40587,40588,40588,40589,
+40590,40591,40592,40593,40593,40594,40595,40596,40597,40597,40598,40599,40600,
+40601,40602,40602,40603,40604,40605,40606,40607,40607,40608,40609,40610,40611,
+40611,40612,40613,40614,40615,40616,40616,40617,40618,40619,40620,40620,40621,
+40622,40623,40624,40625,40625,40626,40627,40628,40629,40630,40630,40631,40632,
+40633,40634,40634,40635,40636,40637,40638,40639,40639,40640,40641,40642,40643,
+40643,40644,40645,40646,40647,40648,40648,40649,40650,40651,40652,40653,40653,
+40654,40655,40656,40657,40657,40658,40659,40660,40661,40662,40662,40663,40664,
+40665,40666,40666,40667,40668,40669,40670,40671,40671,40672,40673,40674,40675,
+40675,40676,40677,40678,40679,40680,40680,40681,40682,40683,40684,40685,40685,
+40686,40687,40688,40689,40689,40690,40691,40692,40693,40694,40694,40695,40696,
+40697,40698,40698,40699,40700,40701,40702,40703,40703,40704,40705,40706,40707,
+40707,40708,40709,40710,40711,40712,40712,40713,40714,40715,40716,40716,40717,
+40718,40719,40720,40721,40721,40722,40723,40724,40725,40725,40726,40727,40728,
+40729,40730,40730,40731,40732,40733,40734,40735,40735,40736,40737,40738,40739,
+40739,40740,40741,40742,40743,40744,40744,40745,40746,40747,40748,40748,40749,
+40750,40751,40752,40753,40753,40754,40755,40756,40757,40757,40758,40759,40760,
+40761,40762,40762,40763,40764,40765,40766,40766,40767,40768,40769,40770,40771,
+40771,40772,40773,40774,40775,40775,40776,40777,40778,40779,40780,40780,40781,
+40782,40783,40784,40784,40785,40786,40787,40788,40788,40789,40790,40791,40792,
+40793,40793,40794,40795,40796,40797,40797,40798,40799,40800,40801,40802,40802,
+40803,40804,40805,40806,40806,40807,40808,40809,40810,40811,40811,40812,40813,
+40814,40815,40815,40816,40817,40818,40819,40820,40820,40821,40822,40823,40824,
+40824,40825,40826,40827,40828,40829,40829,40830,40831,40832,40833,40833,40834,
+40835,40836,40837,40837,40838,40839,40840,40841,40842,40842,40843,40844,40845,
+40846,40846,40847,40848,40849,40850,40851,40851,40852,40853,40854,40855,40855,
+40856,40857,40858,40859,40860,40860,40861,40862,40863,40864,40864,40865,40866,
+40867,40868,40868,40869,40870,40871,40872,40873,40873,40874,40875,40876,40877,
+40877,40878,40879,40880,40881,40882,40882,40883,40884,40885,40886,40886,40887,
+40888,40889,40890,40890,40891,40892,40893,40894,40895,40895,40896,40897,40898,
+40899,40899,40900,40901,40902,40903,40904,40904,40905,40906,40907,40908,40908,
+40909,40910,40911,40912,40912,40913,40914,40915,40916,40917,40917,40918,40919,
+40920,40921,40921,40922,40923,40924,40925,40926,40926,40927,40928,40929,40930,
+40930,40931,40932,40933,40934,40934,40935,40936,40937,40938,40939,40939,40940,
+40941,40942,40943,40943,40944,40945,40946,40947,40947,40948,40949,40950,40951,
+40952,40952,40953,40954,40955,40956,40956,40957,40958,40959,40960,40960,40961,
+40962,40963,40964,40965,40965,40966,40967,40968,40969,40969,40970,40971,40972,
+40973,40973,40974,40975,40976,40977,40978,40978,40979,40980,40981,40982,40982,
+40983,40984,40985,40986,40986,40987,40988,40989,40990,40991,40991,40992,40993,
+40994,40995,40995,40996,40997,40998,40999,40999,41000,41001,41002,41003,41004,
+41004,41005,41006,41007,41008,41008,41009,41010,41011,41012,41012,41013,41014,
+41015,41016,41017,41017,41018,41019,41020,41021,41021,41022,41023,41024,41025,
+41025,41026,41027,41028,41029,41030,41030,41031,41032,41033,41034,41034,41035,
+41036,41037,41038,41038,41039,41040,41041,41042,41042,41043,41044,41045,41046,
+41047,41047,41048,41049,41050,41051,41051,41052,41053,41054,41055,41055,41056,
+41057,41058,41059,41060,41060,41061,41062,41063,41064,41064,41065,41066,41067,
+41068,41068,41069,41070,41071,41072,41072,41073,41074,41075,41076,41077,41077,
+41078,41079,41080,41081,41081,41082,41083,41084,41085,41085,41086,41087,41088,
+41089,41089,41090,41091,41092,41093,41094,41094,41095,41096,41097,41098,41098,
+41099,41100,41101,41102,41102,41103,41104,41105,41106,41106,41107,41108,41109,
+41110,41111,41111,41112,41113,41114,41115,41115,41116,41117,41118,41119,41119,
+41120,41121,41122,41123,41123,41124,41125,41126,41127,41128,41128,41129,41130,
+41131,41132,41132,41133,41134,41135,41136,41136,41137,41138,41139,41140,41140,
+41141,41142,41143,41144,41145,41145,41146,41147,41148,41149,41149,41150,41151,
+41152,41153,41153,41154,41155,41156,41157,41157,41158,41159,41160,41161,41161,
+41162,41163,41164,41165,41166,41166,41167,41168,41169,41170,41170,41171,41172,
+41173,41174,41174,41175,41176,41177,41178,41178,41179,41180,41181,41182,41182,
+41183,41184,41185,41186,41187,41187,41188,41189,41190,41191,41191,41192,41193,
+41194,41195,41195,41196,41197,41198,41199,41199,41200,41201,41202,41203,41203,
+41204,41205,41206,41207,41207,41208,41209,41210,41211,41212,41212,41213,41214,
+41215,41216,41216,41217,41218,41219,41220,41220,41221,41222,41223,41224,41224,
+41225,41226,41227,41228,41228,41229,41230,41231,41232,41232,41233,41234,41235,
+41236,41237,41237,41238,41239,41240,41241,41241,41242,41243,41244,41245,41245,
+41246,41247,41248,41249,41249,41250,41251,41252,41253,41253,41254,41255,41256,
+41257,41257,41258,41259,41260,41261,41261,41262,41263,41264,41265,41266,41266,
+41267,41268,41269,41270,41270,41271,41272,41273,41274,41274,41275,41276,41277,
+41278,41278,41279,41280,41281,41282,41282,41283,41284,41285,41286,41286,41287,
+41288,41289,41290,41290,41291,41292,41293,41294,41294,41295,41296,41297,41298,
+41299,41299,41300,41301,41302,41303,41303,41304,41305,41306,41307,41307,41308,
+41309,41310,41311,41311,41312,41313,41314,41315,41315,41316,41317,41318,41319,
+41319,41320,41321,41322,41323,41323,41324,41325,41326,41327,41327,41328,41329,
+41330,41331,41331,41332,41333,41334,41335,41335,41336,41337,41338,41339,41340,
+41340,41341,41342,41343,41344,41344,41345,41346,41347,41348,41348,41349,41350,
+41351,41352,41352,41353,41354,41355,41356,41356,41357,41358,41359,41360,41360,
+41361,41362,41363,41364,41364,41365,41366,41367,41368,41368,41369,41370,41371,
+41372,41372,41373,41374,41375,41376,41376,41377,41378,41379,41380,41380,41381,
+41382,41383,41384,41384,41385,41386,41387,41388,41388,41389,41390,41391,41392,
+41392,41393,41394,41395,41396,41396,41397,41398,41399,41400,41401,41401,41402,
+41403,41404,41405,41405,41406,41407,41408,41409,41409,41410,41411,41412,41413,
+41413,41414,41415,41416,41417,41417,41418,41419,41420,41421,41421,41422,41423,
+41424,41425,41425,41426,41427,41428,41429,41429,41430,41431,41432,41433,41433,
+41434,41435,41436,41437,41437,41438,41439,41440,41441,41441,41442,41443,41444,
+41445,41445,41446,41447,41448,41449,41449,41450,41451,41452,41453,41453,41454,
+41455,41456,41457,41457,41458,41459,41460,41461,41461,41462,41463,41464,41465,
+41465,41466,41467,41468,41469,41469,41470,41471,41472,41473,41473,41474,41475,
+41476,41477,41477,41478,41479,41480,41481,41481,41482,41483,41484,41485,41485,
+41486,41487,41488,41489,41489,41490,41491,41492,41493,41493,41494,41495,41496,
+41497,41497,41498,41499,41500,41501,41501,41502,41503,41504,41505,41505,41506,
+41507,41508,41509,41509,41510,41511,41512,41513,41513,41514,41515,41516,41517,
+41517,41518,41519,41520,41521,41521,41522,41523,41524,41525,41525,41526,41527,
+41528,41529,41529,41530,41531,41532,41533,41533,41534,41535,41536,41537,41537,
+41538,41539,41540,41541,41541,41542,41543,41544,41545,41545,41546,41547,41548,
+41549,41549,41550,41551,41552,41553,41553,41554,41555,41556,41556,41557,41558,
+41559,41560,41560,41561,41562,41563,41564,41564,41565,41566,41567,41568,41568,
+41569,41570,41571,41572,41572,41573,41574,41575,41576,41576,41577,41578,41579,
+41580,41580,41581,41582,41583,41584,41584,41585,41586,41587,41588,41588,41589,
+41590,41591,41592,41592,41593,41594,41595,41596,41596,41597,41598,41599,41600,
+41600,41601,41602,41603,41604,41604,41605,41606,41607,41608,41608,41609,41610,
+41611,41612,41612,41613,41614,41615,41615,41616,41617,41618,41619,41619,41620,
+41621,41622,41623,41623,41624,41625,41626,41627,41627,41628,41629,41630,41631,
+41631,41632,41633,41634,41635,41635,41636,41637,41638,41639,41639,41640,41641,
+41642,41643,41643,41644,41645,41646,41647,41647,41648,41649,41650,41651,41651,
+41652,41653,41654,41654,41655,41656,41657,41658,41658,41659,41660,41661,41662,
+41662,41663,41664,41665,41666,41666,41667,41668,41669,41670,41670,41671,41672,
+41673,41674,41674,41675,41676,41677,41678,41678,41679,41680,41681,41682,41682,
+41683,41684,41685,41686,41686,41687,41688,41689,41689,41690,41691,41692,41693,
+41693,41694,41695,41696,41697,41697,41698,41699,41700,41701,41701,41702,41703,
+41704,41705,41705,41706,41707,41708,41709,41709,41710,41711,41712,41713,41713,
+41714,41715,41716,41716,41717,41718,41719,41720,41720,41721,41722,41723,41724,
+41724,41725,41726,41727,41728,41728,41729,41730,41731,41732,41732,41733,41734,
+41735,41736,41736,41737,41738,41739,41740,41740,41741,41742,41743,41743,41744,
+41745,41746,41747,41747,41748,41749,41750,41751,41751,41752,41753,41754,41755,
+41755,41756,41757,41758,41759,41759,41760,41761,41762,41763,41763,41764,41765,
+41766,41766,41767,41768,41769,41770,41770,41771,41772,41773,41774,41774,41775,
+41776,41777,41778,41778,41779,41780,41781,41782,41782,41783,41784,41785,41785,
+41786,41787,41788,41789,41789,41790,41791,41792,41793,41793,41794,41795,41796,
+41797,41797,41798,41799,41800,41801,41801,41802,41803,41804,41805,41805,41806,
+41807,41808,41808,41809,41810,41811,41812,41812,41813,41814,41815,41816,41816,
+41817,41818,41819,41820,41820,41821,41822,41823,41824,41824,41825,41826,41827,
+41827,41828,41829,41830,41831,41831,41832,41833,41834,41835,41835,41836,41837,
+41838,41839,41839,41840,41841,41842,41842,41843,41844,41845,41846,41846,41847,
+41848,41849,41850,41850,41851,41852,41853,41854,41854,41855,41856,41857,41858,
+41858,41859,41860,41861,41861,41862,41863,41864,41865,41865,41866,41867,41868,
+41869,41869,41870,41871,41872,41873,41873,41874,41875,41876,41876,41877,41878,
+41879,41880,41880,41881,41882,41883,41884,41884,41885,41886,41887,41888,41888,
+41889,41890,41891,41891,41892,41893,41894,41895,41895,41896,41897,41898,41899,
+41899,41900,41901,41902,41903,41903,41904,41905,41906,41906,41907,41908,41909,
+41910,41910,41911,41912,41913,41914,41914,41915,41916,41917,41918,41918,41919,
+41920,41921,41921,41922,41923,41924,41925,41925,41926,41927,41928,41929,41929,
+41930,41931,41932,41933,41933,41934,41935,41936,41936,41937,41938,41939,41940,
+41940,41941,41942,41943,41944,41944,41945,41946,41947,41948,41948,41949,41950,
+41951,41951,41952,41953,41954,41955,41955,41956,41957,41958,41959,41959,41960,
+41961,41962,41962,41963,41964,41965,41966,41966,41967,41968,41969,41970,41970,
+41971,41972,41973,41974,41974,41975,41976,41977,41977,41978,41979,41980,41981,
+41981,41982,41983,41984,41985,41985,41986,41987,41988,41988,41989,41990,41991,
+41992,41992,41993,41994,41995,41996,41996,41997,41998,41999,42000,42000,42001,
+42002,42003,42003,42004,42005,42006,42007,42007,42008,42009,42010,42011,42011,
+42012,42013,42014,42014,42015,42016,42017,42018,42018,42019,42020,42021,42022,
+42022,42023,42024,42025,42025,42026,42027,42028,42029,42029,42030,42031,42032,
+42033,42033,42034,42035,42036,42036,42037,42038,42039,42040,42040,42041,42042,
+42043,42044,42044,42045,42046,42047,42047,42048,42049,42050,42051,42051,42052,
+42053,42054,42055,42055,42056,42057,42058,42058,42059,42060,42061,42062,42062,
+42063,42064,42065,42066,42066,42067,42068,42069,42069,42070,42071,42072,42073,
+42073,42074,42075,42076,42077,42077,42078,42079,42080,42080,42081,42082,42083,
+42084,42084,42085,42086,42087,42088,42088,42089,42090,42091,42091,42092,42093,
+42094,42095,42095,42096,42097,42098,42099,42099,42100,42101,42102,42102,42103,
+42104,42105,42106,42106,42107,42108,42109,42110,42110,42111,42112,42113,42113,
+42114,42115,42116,42117,42117,42118,42119,42120,42121,42121,42122,42123,42124,
+42124,42125,42126,42127,42128,42128,42129,42130,42131,42131,42132,42133,42134,
+42135,42135,42136,42137,42138,42139,42139,42140,42141,42142,42142,42143,42144,
+42145,42146,42146,42147,42148,42149,42150,42150,42151,42152,42153,42153,42154,
+42155,42156,42157,42157,42158,42159,42160,42160,42161,42162,42163,42164,42164,
+42165,42166,42167,42168,42168,42169,42170,42171,42171,42172,42173,42174,42175,
+42175,42176,42177,42178,42178,42179,42180,42181,42182,42182,42183,42184,42185,
+42186,42186,42187,42188,42189,42189,42190,42191,42192,42193,42193,42194,42195,
+42196,42196,42197,42198,42199,42200,42200,42201,42202,42203,42204,42204,42205,
+42206,42207,42207,42208,42209,42210,42211,42211,42212,42213,42214,42214,42215,
+42216,42217,42218,42218,42219,42220,42221,42222,42222,42223,42224,42225,42225,
+42226,42227,42228,42229,42229,42230,42231,42232,42232,42233,42234,42235,42236,
+42236,42237,42238,42239,42239,42240,42241,42242,42243,42243,42244,42245,42246,
+42247,42247,42248,42249,42250,42250,42251,42252,42253,42254,42254,42255,42256,
+42257,42257,42258,42259,42260,42261,42261,42262,42263,42264,42264,42265,42266,
+42267,42268,42268,42269,42270,42271,42272,42272,42273,42274,42275,42275,42276,
+42277,42278,42279,42279,42280,42281,42282,42282,42283,42284,42285,42286,42286,
+42287,42288,42289,42289,42290,42291,42292,42293,42293,42294,42295,42296,42296,
+42297,42298,42299,42300,42300,42301,42302,42303,42304,42304,42305,42306,42307,
+42307,42308,42309,42310,42311,42311,42312,42313,42314,42314,42315,42316,42317,
+42318,42318,42319,42320,42321,42321,42322,42323,42324,42325,42325,42326,42327,
+42328,42328,42329,42330,42331,42332,42332,42333,42334,42335,42335,42336,42337,
+42338,42339,42339,42340,42341,42342,42342,42343,42344,42345,42346,42346,42347,
+42348,42349,42349,42350,42351,42352,42353,42353,42354,42355,42356,42356,42357,
+42358,42359,42360,42360,42361,42362,42363,42364,42364,42365,42366,42367,42367,
+42368,42369,42370,42371,42371,42372,42373,42374,42374,42375,42376,42377,42378,
+42378,42379,42380,42381,42381,42382,42383,42384,42385,42385,42386,42387,42388,
+42388,42389,42390,42391,42392,42392,42393,42394,42395,42395,42396,42397,42398,
+42399,42399,42400,42401,42402,42402,42403,42404,42405,42406,42406,42407,42408,
+42409,42409,42410,42411,42412,42413,42413,42414,42415,42416,42416,42417,42418,
+42419,42420,42420,42421,42422,42423,42423,42424,42425,42426,42426,42427,42428,
+42429,42430,42430,42431,42432,42433,42433,42434,42435,42436,42437,42437,42438,
+42439,42440,42440,42441,42442,42443,42444,42444,42445,42446,42447,42447,42448,
+42449,42450,42451,42451,42452,42453,42454,42454,42455,42456,42457,42458,42458,
+42459,42460,42461,42461,42462,42463,42464,42465,42465,42466,42467,42468,42468,
+42469,42470,42471,42472,42472,42473,42474,42475,42475,42476,42477,42478,42479,
+42479,42480,42481,42482,42482,42483,42484,42485,42485,42486,42487,42488,42489,
+42489,42490,42491,42492,42492,42493,42494,42495,42496,42496,42497,42498,42499,
+42499,42500,42501,42502,42503,42503,42504,42505,42506,42506,42507,42508,42509,
+42510,42510,42511,42512,42513,42513,42514,42515,42516,42517,42517,42518,42519,
+42520,42520,42521,42522,42523,42523,42524,42525,42526,42527,42527,42528,42529,
+42530,42530,42531,42532,42533,42534,42534,42535,42536,42537,42537,42538,42539,
+42540,42541,42541,42542,42543,42544,42544,42545,42546,42547,42547,42548,42549,
+42550,42551,42551,42552,42553,42554,42554,42555,42556,42557,42558,42558,42559,
+42560,42561,42561,42562,42563,42564,42565,42565,42566,42567,42568,42568,42569,
+42570,42571,42571,42572,42573,42574,42575,42575,42576,42577,42578,42578,42579,
+42580,42581,42582,42582,42583,42584,42585,42585,42586,42587,42588,42588,42589,
+42590,42591,42592,42592,42593,42594,42595,42595,42596,42597,42598,42599,42599,
+42600,42601,42602,42602,42603,42604,42605,42605,42606,42607,42608,42609,42609,
+42610,42611,42612,42612,42613,42614,42615,42616,42616,42617,42618,42619,42619,
+42620,42621,42622,42622,42623,42624,42625,42626,42626,42627,42628,42629,42629,
+42630,42631,42632,42633,42633,42634,42635,42636,42636,42637,42638,42639,42639,
+42640,42641,42642,42643,42643,42644,42645,42646,42646,42647,42648,42649,42650,
+42650,42651,42652,42653,42653,42654,42655,42656,42656,42657,42658,42659,42660,
+42660,42661,42662,42663,42663,42664,42665,42666,42666,42667,42668,42669,42670,
+42670,42671,42672,42673,42673,42674,42675,42676,42677,42677,42678,42679,42680,
+42680,42681,42682,42683,42683,42684,42685,42686,42687,42687,42688,42689,42690,
+42690,42691,42692,42693,42693,42694,42695,42696,42697,42697,42698,42699,42700,
+42700,42701,42702,42703,42703,42704,42705,42706,42707,42707,42708,42709,42710,
+42710,42711,42712,42713,42713,42714,42715,42716,42717,42717,42718,42719,42720,
+42720,42721,42722,42723,42724,42724,42725,42726,42727,42727,42728,42729,42730,
+42730,42731,42732,42733,42734,42734,42735,42736,42737,42737,42738,42739,42740,
+42740,42741,42742,42743,42744,42744,42745,42746,42747,42747,42748,42749,42750,
+42750,42751,42752,42753,42754,42754,42755,42756,42757,42757,42758,42759,42760,
+42760,42761,42762,42763,42764,42764,42765,42766,42767,42767,42768,42769,42770,
+42770,42771,42772,42773,42774,42774,42775,42776,42777,42777,42778,42779,42780,
+42780,42781,42782,42783,42784,42784,42785,42786,42787,42787,42788,42789,42790,
+42790,42791,42792,42793,42793,42794,42795,42796,42797,42797,42798,42799,42800,
+42800,42801,42802,42803,42803,42804,42805,42806,42807,42807,42808,42809,42810,
+42810,42811,42812,42813,42813,42814,42815,42816,42817,42817,42818,42819,42820,
+42820,42821,42822,42823,42823,42824,42825,42826,42827,42827,42828,42829,42830,
+42830,42831,42832,42833,42833,42834,42835,42836,42836,42837,42838,42839,42840,
+42840,42841,42842,42843,42843,42844,42845,42846,42846,42847,42848,42849,42850,
+42850,42851,42852,42853,42853,42854,42855,42856,42856,42857,42858,42859,42860,
+42860,42861,42862,42863,42863,42864,42865,42866,42866,42867,42868,42869,42869,
+42870,42871,42872,42873,42873,42874,42875,42876,42876,42877,42878,42879,42879,
+42880,42881,42882,42883,42883,42884,42885,42886,42886,42887,42888,42889,42889,
+42890,42891,42892,42892,42893,42894,42895,42896,42896,42897,42898,42899,42899,
+42900,42901,42902,42902,42903,42904,42905,42905,42906,42907,42908,42909,42909,
+42910,42911,42912,42912,42913,42914,42915,42915,42916,42917,42918,42919,42919,
+42920,42921,42922,42922,42923,42924,42925,42925,42926,42927,42928,42928,42929,
+42930,42931,42932,42932,42933,42934,42935,42935,42936,42937,42938,42938,42939,
+42940,42941,42941,42942,42943,42944,42945,42945,42946,42947,42948,42948,42949,
+42950,42951,42951,42952,42953,42954,42954,42955,42956,42957,42958,42958,42959,
+42960,42961,42961,42962,42963,42964,42964,42965,42966,42967,42967,42968,42969,
+42970,42971,42971,42972,42973,42974,42974,42975,42976,42977,42977,42978,42979,
+42980,42980,42981,42982,42983,42984,42984,42985,42986,42987,42987,42988,42989,
+42990,42990,42991,42992,42993,42993,42994,42995,42996,42996,42997,42998,42999,
+43000,43000,43001,43002,43003,43003,43004,43005,43006,43006,43007,43008,43009,
+43009,43010,43011,43012,43013,43013,43014,43015,43016,43016,43017,43018,43019,
+43019,43020,43021,43022,43022,43023,43024,43025,43025,43026,43027,43028,43029,
+43029,43030,43031,43032,43032,43033,43034,43035,43035,43036,43037,43038,43038,
+43039,43040,43041,43042,43042,43043,43044,43045,43045,43046,43047,43048,43048,
+43049,43050,43051,43051,43052,43053,43054,43054,43055,43056,43057,43058,43058,
+43059,43060,43061,43061,43062,43063,43064,43064,43065,43066,43067,43067,43068,
+43069,43070,43070,43071,43072,43073,43074,43074,43075,43076,43077,43077,43078,
+43079,43080,43080,43081,43082,43083,43083,43084,43085,43086,43086,43087,43088,
+43089,43090,43090,43091,43092,43093,43093,43094,43095,43096,43096,43097,43098,
+43099,43099,43100,43101,43102,43102,43103,43104,43105,43106,43106,43107,43108,
+43109,43109,43110,43111,43112,43112,43113,43114,43115,43115,43116,43117,43118,
+43118,43119,43120,43121,43121,43122,43123,43124,43125,43125,43126,43127,43128,
+43128,43129,43130,43131,43131,43132,43133,43134,43134,43135,43136,43137,43137,
+43138,43139,43140,43141,43141,43142,43143,43144,43144,43145,43146,43147,43147,
+43148,43149,43150,43150,43151,43152,43153,43153,43154,43155,43156,43156,43157,
+43158,43159,43160,43160,43161,43162,43163,43163,43164,43165,43166,43166,43167,
+43168,43169,43169,43170,43171,43172,43172,43173,43174,43175,43175,43176,43177,
+43178,43179,43179,43180,43181,43182,43182,43183,43184,43185,43185,43186,43187,
+43188,43188,43189,43190,43191,43191,43192,43193,43194,43194,43195,43196,43197,
+43197,43198,43199,43200,43201,43201,43202,43203,43204,43204,43205,43206,43207,
+43207,43208,43209,43210,43210,43211,43212,43213,43213,43214,43215,43216,43216,
+43217,43218,43219,43219,43220,43221,43222,43223,43223,43224,43225,43226,43226,
+43227,43228,43229,43229,43230,43231,43232,43232,43233,43234,43235,43235,43236,
+43237,43238,43238,43239,43240,43241,43241,43242,43243,43244,43245,43245,43246,
+43247,43248,43248,43249,43250,43251,43251,43252,43253,43254,43254,43255,43256,
+43257,43257,43258,43259,43260,43260,43261,43262,43263,43263,43264,43265,43266,
+43266,43267,43268,43269,43270,43270,43271,43272,43273,43273,43274,43275,43276,
+43276,43277,43278,43279,43279,43280,43281,43282,43282,43283,43284,43285,43285,
+43286,43287,43288,43288,43289,43290,43291,43291,43292,43293,43294,43295,43295,
+43296,43297,43298,43298,43299,43300,43301,43301,43302,43303,43304,43304,43305,
+43306,43307,43307,43308,43309,43310,43310,43311,43312,43313,43313,43314,43315,
+43316,43316,43317,43318,43319,43319,43320,43321,43322,43323,43323,43324,43325,
+43326,43326,43327,43328,43329,43329,43330,43331,43332,43332,43333,43334,43335,
+43335,43336,43337,43338,43338,43339,43340,43341,43341,43342,43343,43344,43344,
+43345,43346,43347,43347,43348,43349,43350,43350,43351,43352,43353,43353,43354,
+43355,43356,43357,43357,43358,43359,43360,43360,43361,43362,43363,43363,43364,
+43365,43366,43366,43367,43368,43369,43369,43370,43371,43372,43372,43373,43374,
+43375,43375,43376,43377,43378,43378,43379,43380,43381,43381,43382,43383,43384,
+43384,43385,43386,43387,43387,43388,43389,43390,43390,43391,43392,43393,43394,
+43394,43395,43396,43397,43397,43398,43399,43400,43400,43401,43402,43403,43403,
+43404,43405,43406,43406,43407,43408,43409,43409,43410,43411,43412,43412,43413,
+43414,43415,43415,43416,43417,43418,43418,43419,43420,43421,43421,43422,43423,
+43424,43424,43425,43426,43427,43427,43428,43429,43430,43430,43431,43432,43433,
+43433,43434,43435,43436,43437,43437,43438,43439,43440,43440,43441,43442,43443,
+43443,43444,43445,43446,43446,43447,43448,43449,43449,43450,43451,43452,43452,
+43453,43454,43455,43455,43456,43457,43458,43458,43459,43460,43461,43461,43462,
+43463,43464,43464,43465,43466,43467,43467,43468,43469,43470,43470,43471,43472,
+43473,43473,43474,43475,43476,43476,43477,43478,43479,43479,43480,43481,43482,
+43482,43483,43484,43485,43485,43486,43487,43488,43488,43489,43490,43491,43491,
+43492,43493,43494,43494,43495,43496,43497,43497,43498,43499,43500,43501,43501,
+43502,43503,43504,43504,43505,43506,43507,43507,43508,43509,43510,43510,43511,
+43512,43513,43513,43514,43515,43516,43516,43517,43518,43519,43519,43520,43521,
+43522,43522,43523,43524,43525,43525,43526,43527,43528,43528,43529,43530,43531,
+43531,43532,43533,43534,43534,43535,43536,43537,43537,43538,43539,43540,43540,
+43541,43542,43543,43543,43544,43545,43546,43546,43547,43548,43549,43549,43550,
+43551,43552,43552,43553,43554,43555,43555,43556,43557,43558,43558,43559,43560,
+43561,43561,43562,43563,43564,43564,43565,43566,43567,43567,43568,43569,43570,
+43570,43571,43572,43573,43573,43574,43575,43576,43576,43577,43578,43579,43579,
+43580,43581,43582,43582,43583,43584,43585,43585,43586,43587,43588,43588,43589,
+43590,43591,43591,43592,43593,43594,43594,43595,43596,43597,43597,43598,43599,
+43600,43600,43601,43602,43603,43603,43604,43605,43606,43606,43607,43608,43609,
+43609,43610,43611,43612,43612,43613,43614,43615,43615,43616,43617,43618,43618,
+43619,43620,43621,43621,43622,43623,43624,43624,43625,43626,43627,43627,43628,
+43629,43630,43630,43631,43632,43633,43633,43634,43635,43636,43636,43637,43638,
+43639,43639,43640,43641,43642,43642,43643,43644,43645,43645,43646,43647,43648,
+43648,43649,43650,43651,43651,43652,43653,43654,43654,43655,43656,43657,43657,
+43658,43659,43660,43660,43661,43662,43663,43663,43664,43665,43666,43666,43667,
+43668,43669,43669,43670,43671,43672,43672,43673,43674,43675,43675,43676,43677,
+43678,43678,43679,43680,43681,43681,43682,43683,43684,43684,43685,43686,43687,
+43687,43688,43689,43690,43690,43691,43692,43693,43693,43694,43695,43696,43696,
+43697,43698,43699,43699,43700,43701,43702,43702,43703,43704,43705,43705,43706,
+43707,43707,43708,43709,43710,43710,43711,43712,43713,43713,43714,43715,43716,
+43716,43717,43718,43719,43719,43720,43721,43722,43722,43723,43724,43725,43725,
+43726,43727,43728,43728,43729,43730,43731,43731,43732,43733,43734,43734,43735,
+43736,43737,43737,43738,43739,43740,43740,43741,43742,43743,43743,43744,43745,
+43746,43746,43747,43748,43749,43749,43750,43751,43752,43752,43753,43754,43755,
+43755,43756,43757,43758,43758,43759,43760,43761,43761,43762,43763,43764,43764,
+43765,43766,43767,43767,43768,43769,43769,43770,43771,43772,43772,43773,43774,
+43775,43775,43776,43777,43778,43778,43779,43780,43781,43781,43782,43783,43784,
+43784,43785,43786,43787,43787,43788,43789,43790,43790,43791,43792,43793,43793,
+43794,43795,43796,43796,43797,43798,43799,43799,43800,43801,43802,43802,43803,
+43804,43805,43805,43806,43807,43808,43808,43809,43810,43811,43811,43812,43813,
+43813,43814,43815,43816,43816,43817,43818,43819,43819,43820,43821,43822,43822,
+43823,43824,43825,43825,43826,43827,43828,43828,43829,43830,43831,43831,43832,
+43833,43834,43834,43835,43836,43837,43837,43838,43839,43840,43840,43841,43842,
+43843,43843,43844,43845,43846,43846,43847,43848,43849,43849,43850,43851,43851,
+43852,43853,43854,43854,43855,43856,43857,43857,43858,43859,43860,43860,43861,
+43862,43863,43863,43864,43865,43866,43866,43867,43868,43869,43869,43870,43871,
+43872,43872,43873,43874,43875,43875,43876,43877,43878,43878,43879,43880,43881,
+43881,43882,43883,43883,43884,43885,43886,43886,43887,43888,43889,43889,43890,
+43891,43892,43892,43893,43894,43895,43895,43896,43897,43898,43898,43899,43900,
+43901,43901,43902,43903,43904,43904,43905,43906,43907,43907,43908,43909,43910,
+43910,43911,43912,43912,43913,43914,43915,43915,43916,43917,43918,43918,43919,
+43920,43921,43921,43922,43923,43924,43924,43925,43926,43927,43927,43928,43929,
+43930,43930,43931,43932,43933,43933,43934,43935,43936,43936,43937,43938,43938,
+43939,43940,43941,43941,43942,43943,43944,43944,43945,43946,43947,43947,43948,
+43949,43950,43950,43951,43952,43953,43953,43954,43955,43956,43956,43957,43958,
+43959,43959,43960,43961,43961,43962,43963,43964,43964,43965,43966,43967,43967,
+43968,43969,43970,43970,43971,43972,43973,43973,43974,43975,43976,43976,43977,
+43978,43979,43979,43980,43981,43982,43982,43983,43984,43984,43985,43986,43987,
+43987,43988,43989,43990,43990,43991,43992,43993,43993,43994,43995,43996,43996,
+43997,43998,43999,43999,44000,44001,44002,44002,44003,44004,44004,44005,44006,
+44007,44007,44008,44009,44010,44010,44011,44012,44013,44013,44014,44015,44016,
+44016,44017,44018,44019,44019,44020,44021,44022,44022,44023,44024,44025,44025,
+44026,44027,44027,44028,44029,44030,44030,44031,44032,44033,44033,44034,44035,
+44036,44036,44037,44038,44039,44039,44040,44041,44042,44042,44043,44044,44044,
+44045,44046,44047,44047,44048,44049,44050,44050,44051,44052,44053,44053,44054,
+44055,44056,44056,44057,44058,44059,44059,44060,44061,44062,44062,44063,44064,
+44064,44065,44066,44067,44067,44068,44069,44070,44070,44071,44072,44073,44073,
+44074,44075,44076,44076,44077,44078,44079,44079,44080,44081,44081,44082,44083,
+44084,44084,44085,44086,44087,44087,44088,44089,44090,44090,44091,44092,44093,
+44093,44094,44095,44096,44096,44097,44098,44098,44099,44100,44101,44101,44102,
+44103,44104,44104,44105,44106,44107,44107,44108,44109,44110,44110,44111,44112,
+44113,44113,44114,44115,44115,44116,44117,44118,44118,44119,44120,44121,44121,
+44122,44123,44124,44124,44125,44126,44127,44127,44128,44129,44130,44130,44131,
+44132,44132,44133,44134,44135,44135,44136,44137,44138,44138,44139,44140,44141,
+44141,44142,44143,44144,44144,44145,44146,44146,44147,44148,44149,44149,44150,
+44151,44152,44152,44153,44154,44155,44155,44156,44157,44158,44158,44159,44160,
+44161,44161,44162,44163,44163,44164,44165,44166,44166,44167,44168,44169,44169,
+44170,44171,44172,44172,44173,44174,44175,44175,44176,44177,44177,44178,44179,
+44180,44180,44181,44182,44183,44183,44184,44185,44186,44186,44187,44188,44189,
+44189,44190,44191,44191,44192,44193,44194,44194,44195,44196,44197,44197,44198,
+44199,44200,44200,44201,44202,44203,44203,44204,44205,44205,44206,44207,44208,
+44208,44209,44210,44211,44211,44212,44213,44214,44214,44215,44216,44217,44217,
+44218,44219,44219,44220,44221,44222,44222,44223,44224,44225,44225,44226,44227,
+44228,44228,44229,44230,44231,44231,44232,44233,44233,44234,44235,44236,44236,
+44237,44238,44239,44239,44240,44241,44242,44242,44243,44244,44245,44245,44246,
+44247,44247,44248,44249,44250,44250,44251,44252,44253,44253,44254,44255,44256,
+44256,44257,44258,44258,44259,44260,44261,44261,44262,44263,44264,44264,44265,
+44266,44267,44267,44268,44269,44270,44270,44271,44272,44272,44273,44274,44275,
+44275,44276,44277,44278,44278,44279,44280,44281,44281,44282,44283,44283,44284,
+44285,44286,44286,44287,44288,44289,44289,44290,44291,44292,44292,44293,44294,
+44295,44295,44296,44297,44297,44298,44299,44300,44300,44301,44302,44303,44303,
+44304,44305,44306,44306,44307,44308,44308,44309,44310,44311,44311,44312,44313,
+44314,44314,44315,44316,44317,44317,44318,44319,44319,44320,44321,44322,44322,
+44323,44324,44325,44325,44326,44327,44328,44328,44329,44330,44331,44331,44332,
+44333,44333,44334,44335,44336,44336,44337,44338,44339,44339,44340,44341,44342,
+44342,44343,44344,44344,44345,44346,44347,44347,44348,44349,44350,44350,44351,
+44352,44353,44353,44354,44355,44355,44356,44357,44358,44358,44359,44360,44361,
+44361,44362,44363,44364,44364,44365,44366,44366,44367,44368,44369,44369,44370,
+44371,44372,44372,44373,44374,44375,44375,44376,44377,44377,44378,44379,44380,
+44380,44381,44382,44383,44383,44384,44385,44386,44386,44387,44388,44388,44389,
+44390,44391,44391,44392,44393,44394,44394,44395,44396,44397,44397,44398,44399,
+44399,44400,44401,44402,44402,44403,44404,44405,44405,44406,44407,44408,44408,
+44409,44410,44410,44411,44412,44413,44413,44414,44415,44416,44416,44417,44418,
+44418,44419,44420,44421,44421,44422,44423,44424,44424,44425,44426,44427,44427,
+44428,44429,44429,44430,44431,44432,44432,44433,44434,44435,44435,44436,44437,
+44438,44438,44439,44440,44440,44441,44442,44443,44443,44444,44445,44446,44446,
+44447,44448,44448,44449,44450,44451,44451,44452,44453,44454,44454,44455,44456,
+44457,44457,44458,44459,44459,44460,44461,44462,44462,44463,44464,44465,44465,
+44466,44467,44468,44468,44469,44470,44470,44471,44472,44473,44473,44474,44475,
+44476,44476,44477,44478,44478,44479,44480,44481,44481,44482,44483,44484,44484,
+44485,44486,44487,44487,44488,44489,44489,44490,44491,44492,44492,44493,44494,
+44495,44495,44496,44497,44497,44498,44499,44500,44500,44501,44502,44503,44503,
+44504,44505,44506,44506,44507,44508,44508,44509,44510,44511,44511,44512,44513,
+44514,44514,44515,44516,44516,44517,44518,44519,44519,44520,44521,44522,44522,
+44523,44524,44524,44525,44526,44527,44527,44528,44529,44530,44530,44531,44532,
+44533,44533,44534,44535,44535,44536,44537,44538,44538,44539,44540,44541,44541,
+44542,44543,44543,44544,44545,44546,44546,44547,44548,44549,44549,44550,44551,
+44551,44552,44553,44554,44554,44555,44556,44557,44557,44558,44559,44560,44560,
+44561,44562,44562,44563,44564,44565,44565,44566,44567,44568,44568,44569,44570,
+44570,44571,44572,44573,44573,44574,44575,44576,44576,44577,44578,44578,44579,
+44580,44581,44581,44582,44583,44584,44584,44585,44586,44586,44587,44588,44589,
+44589,44590,44591,44592,44592,44593,44594,44594,44595,44596,44597,44597,44598,
+44599,44600,44600,44601,44602,44603,44603,44604,44605,44605,44606,44607,44608,
+44608,44609,44610,44611,44611,44612,44613,44613,44614,44615,44616,44616,44617,
+44618,44619,44619,44620,44621,44621,44622,44623,44624,44624,44625,44626,44627,
+44627,44628,44629,44629,44630,44631,44632,44632,44633,44634,44635,44635,44636,
+44637,44637,44638,44639,44640,44640,44641,44642,44643,44643,44644,44645,44645,
+44646,44647,44648,44648,44649,44650,44651,44651,44652,44653,44653,44654,44655,
+44656,44656,44657,44658,44659,44659,44660,44661,44661,44662,44663,44664,44664,
+44665,44666,44667,44667,44668,44669,44669,44670,44671,44672,44672,44673,44674,
+44675,44675,44676,44677,44677,44678,44679,44680,44680,44681,44682,44683,44683,
+44684,44685,44685,44686,44687,44688,44688,44689,44690,44691,44691,44692,44693,
+44693,44694,44695,44696,44696,44697,44698,44699,44699,44700,44701,44701,44702,
+44703,44704,44704,44705,44706,44706,44707,44708,44709,44709,44710,44711,44712,
+44712,44713,44714,44714,44715,44716,44717,44717,44718,44719,44720,44720,44721,
+44722,44722,44723,44724,44725,44725,44726,44727,44728,44728,44729,44730,44730,
+44731,44732,44733,44733,44734,44735,44736,44736,44737,44738,44738,44739,44740,
+44741,44741,44742,44743,44744,44744,44745,44746,44746,44747,44748,44749,44749,
+44750,44751,44751,44752,44753,44754,44754,44755,44756,44757,44757,44758,44759,
+44759,44760,44761,44762,44762,44763,44764,44765,44765,44766,44767,44767,44768,
+44769,44770,44770,44771,44772,44773,44773,44774,44775,44775,44776,44777,44778,
+44778,44779,44780,44780,44781,44782,44783,44783,44784,44785,44786,44786,44787,
+44788,44788,44789,44790,44791,44791,44792,44793,44794,44794,44795,44796,44796,
+44797,44798,44799,44799,44800,44801,44801,44802,44803,44804,44804,44805,44806,
+44807,44807,44808,44809,44809,44810,44811,44812,44812,44813,44814,44815,44815,
+44816,44817,44817,44818,44819,44820,44820,44821,44822,44822,44823,44824,44825,
+44825,44826,44827,44828,44828,44829,44830,44830,44831,44832,44833,44833,44834,
+44835,44835,44836,44837,44838,44838,44839,44840,44841,44841,44842,44843,44843,
+44844,44845,44846,44846,44847,44848,44849,44849,44850,44851,44851,44852,44853,
+44854,44854,44855,44856,44856,44857,44858,44859,44859,44860,44861,44862,44862,
+44863,44864,44864,44865,44866,44867,44867,44868,44869,44869,44870,44871,44872,
+44872,44873,44874,44875,44875,44876,44877,44877,44878,44879,44880,44880,44881,
+44882,44882,44883,44884,44885,44885,44886,44887,44888,44888,44889,44890,44890,
+44891,44892,44893,44893,44894,44895,44895,44896,44897,44898,44898,44899,44900,
+44901,44901,44902,44903,44903,44904,44905,44906,44906,44907,44908,44908,44909,
+44910,44911,44911,44912,44913,44914,44914,44915,44916,44916,44917,44918,44919,
+44919,44920,44921,44921,44922,44923,44924,44924,44925,44926,44927,44927,44928,
+44929,44929,44930,44931,44932,44932,44933,44934,44934,44935,44936,44937,44937,
+44938,44939,44940,44940,44941,44942,44942,44943,44944,44945,44945,44946,44947,
+44947,44948,44949,44950,44950,44951,44952,44952,44953,44954,44955,44955,44956,
+44957,44958,44958,44959,44960,44960,44961,44962,44963,44963,44964,44965,44965,
+44966,44967,44968,44968,44969,44970,44971,44971,44972,44973,44973,44974,44975,
+44976,44976,44977,44978,44978,44979,44980,44981,44981,44982,44983,44983,44984,
+44985,44986,44986,44987,44988,44989,44989,44990,44991,44991,44992,44993,44994,
+44994,44995,44996,44996,44997,44998,44999,44999,45000,45001,45001,45002,45003,
+45004,45004,45005,45006,45007,45007,45008,45009,45009,45010,45011,45012,45012,
+45013,45014,45014,45015,45016,45017,45017,45018,45019,45019,45020,45021,45022,
+45022,45023,45024,45025,45025,45026,45027,45027,45028,45029,45030,45030,45031,
+45032,45032,45033,45034,45035,45035,45036,45037,45037,45038,45039,45040,45040,
+45041,45042,45042,45043,45044,45045,45045,45046,45047,45048,45048,45049,45050,
+45050,45051,45052,45053,45053,45054,45055,45055,45056,45057,45058,45058,45059,
+45060,45060,45061,45062,45063,45063,45064,45065,45065,45066,45067,45068,45068,
+45069,45070,45071,45071,45072,45073,45073,45074,45075,45076,45076,45077,45078,
+45078,45079,45080,45081,45081,45082,45083,45083,45084,45085,45086,45086,45087,
+45088,45088,45089,45090,45091,45091,45092,45093,45094,45094,45095,45096,45096,
+45097,45098,45099,45099,45100,45101,45101,45102,45103,45104,45104,45105,45106,
+45106,45107,45108,45109,45109,45110,45111,45111,45112,45113,45114,45114,45115,
+45116,45116,45117,45118,45119,45119,45120,45121,45121,45122,45123,45124,45124,
+45125,45126,45127,45127,45128,45129,45129,45130,45131,45132,45132,45133,45134,
+45134,45135,45136,45137,45137,45138,45139,45139,45140,45141,45142,45142,45143,
+45144,45144,45145,45146,45147,45147,45148,45149,45149,45150,45151,45152,45152,
+45153,45154,45154,45155,45156,45157,45157,45158,45159,45160,45160,45161,45162,
+45162,45163,45164,45165,45165,45166,45167,45167,45168,45169,45170,45170,45171,
+45172,45172,45173,45174,45175,45175,45176,45177,45177,45178,45179,45180,45180,
+45181,45182,45182,45183,45184,45185,45185,45186,45187,45187,45188,45189,45190,
+45190,45191,45192,45192,45193,45194,45195,45195,45196,45197,45197,45198,45199,
+45200,45200,45201,45202,45202,45203,45204,45205,45205,45206,45207,45207,45208,
+45209,45210,45210,45211,45212,45212,45213,45214,45215,45215,45216,45217,45218,
+45218,45219,45220,45220,45221,45222,45223,45223,45224,45225,45225,45226,45227,
+45228,45228,45229,45230,45230,45231,45232,45233,45233,45234,45235,45235,45236,
+45237,45238,45238,45239,45240,45240,45241,45242,45243,45243,45244,45245,45245,
+45246,45247,45248,45248,45249,45250,45250,45251,45252,45253,45253,45254,45255,
+45255,45256,45257,45258,45258,45259,45260,45260,45261,45262,45263,45263,45264,
+45265,45265,45266,45267,45268,45268,45269,45270,45270,45271,45272,45273,45273,
+45274,45275,45275,45276,45277,45278,45278,45279,45280,45280,45281,45282,45283,
+45283,45284,45285,45285,45286,45287,45288,45288,45289,45290,45290,45291,45292,
+45293,45293,45294,45295,45295,45296,45297,45298,45298,45299,45300,45300,45301,
+45302,45303,45303,45304,45305,45305,45306,45307,45308,45308,45309,45310,45310,
+45311,45312,45313,45313,45314,45315,45315,45316,45317,45318,45318,45319,45320,
+45320,45321,45322,45323,45323,45324,45325,45325,45326,45327,45328,45328,45329,
+45330,45330,45331,45332,45333,45333,45334,45335,45335,45336,45337,45337,45338,
+45339,45340,45340,45341,45342,45342,45343,45344,45345,45345,45346,45347,45347,
+45348,45349,45350,45350,45351,45352,45352,45353,45354,45355,45355,45356,45357,
+45357,45358,45359,45360,45360,45361,45362,45362,45363,45364,45365,45365,45366,
+45367,45367,45368,45369,45370,45370,45371,45372,45372,45373,45374,45375,45375,
+45376,45377,45377,45378,45379,45380,45380,45381,45382,45382,45383,45384,45385,
+45385,45386,45387,45387,45388,45389,45390,45390,45391,45392,45392,45393,45394,
+45394,45395,45396,45397,45397,45398,45399,45399,45400,45401,45402,45402,45403,
+45404,45404,45405,45406,45407,45407,45408,45409,45409,45410,45411,45412,45412,
+45413,45414,45414,45415,45416,45417,45417,45418,45419,45419,45420,45421,45422,
+45422,45423,45424,45424,45425,45426,45427,45427,45428,45429,45429,45430,45431,
+45431,45432,45433,45434,45434,45435,45436,45436,45437,45438,45439,45439,45440,
+45441,45441,45442,45443,45444,45444,45445,45446,45446,45447,45448,45449,45449,
+45450,45451,45451,45452,45453,45454,45454,45455,45456,45456,45457,45458,45458,
+45459,45460,45461,45461,45462,45463,45463,45464,45465,45466,45466,45467,45468,
+45468,45469,45470,45471,45471,45472,45473,45473,45474,45475,45476,45476,45477,
+45478,45478,45479,45480,45481,45481,45482,45483,45483,45484,45485,45485,45486,
+45487,45488,45488,45489,45490,45490,45491,45492,45493,45493,45494,45495,45495,
+45496,45497,45498,45498,45499,45500,45500,45501,45502,45503,45503,45504,45505,
+45505,45506,45507,45507,45508,45509,45510,45510,45511,45512,45512,45513,45514,
+45515,45515,45516,45517,45517,45518,45519,45520,45520,45521,45522,45522,45523,
+45524,45525,45525,45526,45527,45527,45528,45529,45529,45530,45531,45532,45532,
+45533,45534,45534,45535,45536,45537,45537,45538,45539,45539,45540,45541,45542,
+45542,45543,45544,45544,45545,45546,45546,45547,45548,45549,45549,45550,45551,
+45551,45552,45553,45554,45554,45555,45556,45556,45557,45558,45559,45559,45560,
+45561,45561,45562,45563,45564,45564,45565,45566,45566,45567,45568,45568,45569,
+45570,45571,45571,45572,45573,45573,45574,45575,45576,45576,45577,45578,45578,
+45579,45580,45581,45581,45582,45583,45583,45584,45585,45585,45586,45587,45588,
+45588,45589,45590,45590,45591,45592,45593,45593,45594,45595,45595,45596,45597,
+45597,45598,45599,45600,45600,45601,45602,45602,45603,45604,45605,45605,45606,
+45607,45607,45608,45609,45610,45610,45611,45612,45612,45613,45614,45614,45615,
+45616,45617,45617,45618,45619,45619,45620,45621,45622,45622,45623,45624,45624,
+45625,45626,45626,45627,45628,45629,45629,45630,45631,45631,45632,45633,45634,
+45634,45635,45636,45636,45637,45638,45639,45639,45640,45641,45641,45642,45643,
+45643,45644,45645,45646,45646,45647,45648,45648,45649,45650,45651,45651,45652,
+45653,45653,45654,45655,45655,45656,45657,45658,45658,45659,45660,45660,45661,
+45662,45663,45663,45664,45665,45665,45666,45667,45667,45668,45669,45670,45670,
+45671,45672,45672,45673,45674,45675,45675,45676,45677,45677,45678,45679,45679,
+45680,45681,45682,45682,45683,45684,45684,45685,45686,45687,45687,45688,45689,
+45689,45690,45691,45691,45692,45693,45694,45694,45695,45696,45696,45697,45698,
+45699,45699,45700,45701,45701,45702,45703,45703,45704,45705,45706,45706,45707,
+45708,45708,45709,45710,45711,45711,45712,45713,45713,45714,45715,45715,45716,
+45717,45718,45718,45719,45720,45720,45721,45722,45723,45723,45724,45725,45725,
+45726,45727,45727,45728,45729,45730,45730,45731,45732,45732,45733,45734,45735,
+45735,45736,45737,45737,45738,45739,45739,45740,45741,45742,45742,45743,45744,
+45744,45745,45746,45747,45747,45748,45749,45749,45750,45751,45751,45752,45753,
+45754,45754,45755,45756,45756,45757,45758,45758,45759,45760,45761,45761,45762,
+45763,45763,45764,45765,45766,45766,45767,45768,45768,45769,45770,45770,45771,
+45772,45773,45773,45774,45775,45775,45776,45777,45778,45778,45779,45780,45780,
+45781,45782,45782,45783,45784,45785,45785,45786,45787,45787,45788,45789,45789,
+45790,45791,45792,45792,45793,45794,45794,45795,45796,45797,45797,45798,45799,
+45799,45800,45801,45801,45802,45803,45804,45804,45805,45806,45806,45807,45808,
+45808,45809,45810,45811,45811,45812,45813,45813,45814,45815,45816,45816,45817,
+45818,45818,45819,45820,45820,45821,45822,45823,45823,45824,45825,45825,45826,
+45827,45827,45828,45829,45830,45830,45831,45832,45832,45833,45834,45834,45835,
+45836,45837,45837,45838,45839,45839,45840,45841,45842,45842,45843,45844,45844,
+45845,45846,45846,45847,45848,45849,45849,45850,45851,45851,45852,45853,45853,
+45854,45855,45856,45856,45857,45858,45858,45859,45860,45860,45861,45862,45863,
+45863,45864,45865,45865,45866,45867,45868,45868,45869,45870,45870,45871,45872,
+45872,45873,45874,45875,45875,45876,45877,45877,45878,45879,45879,45880,45881,
+45882,45882,45883,45884,45884,45885,45886,45886,45887,45888,45889,45889,45890,
+45891,45891,45892,45893,45894,45894,45895,45896,45896,45897,45898,45898,45899,
+45900,45901,45901,45902,45903,45903,45904,45905,45905,45906,45907,45908,45908,
+45909,45910,45910,45911,45912,45912,45913,45914,45915,45915,45916,45917,45917,
+45918,45919,45919,45920,45921,45922,45922,45923,45924,45924,45925,45926,45926,
+45927,45928,45929,45929,45930,45931,45931,45932,45933,45933,45934,45935,45936,
+45936,45937,45938,45938,45939,45940,45940,45941,45942,45943,45943,45944,45945,
+45945,45946,45947,45948,45948,45949,45950,45950,45951,45952,45952,45953,45954,
+45955,45955,45956,45957,45957,45958,45959,45959,45960,45961,45962,45962,45963,
+45964,45964,45965,45966,45966,45967,45968,45969,45969,45970,45971,45971,45972,
+45973,45973,45974,45975,45976,45976,45977,45978,45978,45979,45980,45980,45981,
+45982,45983,45983,45984,45985,45985,45986,45987,45987,45988,45989,45990,45990,
+45991,45992,45992,45993,45994,45994,45995,45996,45997,45997,45998,45999,45999,
+46000,46001,46001,46002,46003,46004,46004,46005,46006,46006,46007,46008,46008,
+46009,46010,46011,46011,46012,46013,46013,46014,46015,46015,46016,46017,46018,
+46018,46019,46020,46020,46021,46022,46022,46023,46024,46025,46025,46026,46027,
+46027,46028,46029,46029,46030,46031,46031,46032,46033,46034,46034,46035,46036,
+46036,46037,46038,46038,46039,46040,46041,46041,46042,46043,46043,46044,46045,
+46045,46046,46047,46048,46048,46049,46050,46050,46051,46052,46052,46053,46054,
+46055,46055,46056,46057,46057,46058,46059,46059,46060,46061,46062,46062,46063,
+46064,46064,46065,46066,46066,46067,46068,46069,46069,46070,46071,46071,46072,
+46073,46073,46074,46075,46076,46076,46077,46078,46078,46079,46080,46080,46081,
+46082,46082,46083,46084,46085,46085,46086,46087,46087,46088,46089,46089,46090,
+46091,46092,46092,46093,46094,46094,46095,46096,46096,46097,46098,46099,46099,
+46100,46101,46101,46102,46103,46103,46104,46105,46106,46106,46107,46108,46108,
+46109,46110,46110,46111,46112,46112,46113,46114,46115,46115,46116,46117,46117,
+46118,46119,46119,46120,46121,46122,46122,46123,46124,46124,46125,46126,46126,
+46127,46128,46129,46129,46130,46131,46131,46132,46133,46133,46134,46135,46136,
+46136,46137,46138,46138,46139,46140,46140,46141,46142,46142,46143,46144,46145,
+46145,46146,46147,46147,46148,46149,46149,46150,46151,46152,46152,46153,46154,
+46154,46155,46156,46156,46157,46158,46159,46159,46160,46161,46161,46162,46163,
+46163,46164,46165,46165,46166,46167,46168,46168,46169,46170,46170,46171,46172,
+46172,46173,46174,46175,46175,46176,46177,46177,46178,46179,46179,46180,46181,
+46181,46182,46183,46184,46184,46185,46186,46186,46187,46188,46188,46189,46190,
+46191,46191,46192,46193,46193,46194,46195,46195,46196,46197,46197,46198,46199,
+46200,46200,46201,46202,46202,46203,46204,46204,46205,46206,46207,46207,46208,
+46209,46209,46210,46211,46211,46212,46213,46213,46214,46215,46216,46216,46217,
+46218,46218,46219,46220,46220,46221,46222,46223,46223,46224,46225,46225,46226,
+46227,46227,46228,46229,46229,46230,46231,46232,46232,46233,46234,46234,46235,
+46236,46236,46237,46238,46239,46239,46240,46241,46241,46242,46243,46243,46244,
+46245,46245,46246,46247,46248,46248,46249,46250,46250,46251,46252,46252,46253,
+46254,46255,46255,46256,46257,46257,46258,46259,46259,46260,46261,46261,46262,
+46263,46264,46264,46265,46266,46266,46267,46268,46268,46269,46270,46270,46271,
+46272,46273,46273,46274,46275,46275,46276,46277,46277,46278,46279,46280,46280,
+46281,46282,46282,46283,46284,46284,46285,46286,46286,46287,46288,46289,46289,
+46290,46291,46291,46292,46293,46293,46294,46295,46295,46296,46297,46298,46298,
+46299,46300,46300,46301,46302,46302,46303,46304,46304,46305,46306,46307,46307,
+46308,46309,46309,46310,46311,46311,46312,46313,46314,46314,46315,46316,46316,
+46317,46318,46318,46319,46320,46320,46321,46322,46323,46323,46324,46325,46325,
+46326,46327,46327,46328,46329,46329,46330,46331,46332,46332,46333,46334,46334,
+46335,46336,46336,46337,46338,46338,46339,46340,46341,46341,46342,46343,46343,
+46344,46345,46345,46346,46347,46347,46348,46349,46350,46350,46351,46352,46352,
+46353,46354,46354,46355,46356,46356,46357,46358,46359,46359,46360,46361,46361,
+46362,46363,46363,46364,46365,46365,46366,46367,46368,46368,46369,46370,46370,
+46371,46372,46372,46373,46374,46374,46375,46376,46377,46377,46378,46379,46379,
+46380,46381,46381,46382,46383,46383,46384,46385,46386,46386,46387,46388,46388,
+46389,46390,46390,46391,46392,46392,46393,46394,46395,46395,46396,46397,46397,
+46398,46399,46399,46400,46401,46401,46402,46403,46404,46404,46405,46406,46406,
+46407,46408,46408,46409,46410,46410,46411,46412,46413,46413,46414,46415,46415,
+46416,46417,46417,46418,46419,46419,46420,46421,46422,46422,46423,46424,46424,
+46425,46426,46426,46427,46428,46428,46429,46430,46431,46431,46432,46433,46433,
+46434,46435,46435,46436,46437,46437,46438,46439,46440,46440,46441,46442,46442,
+46443,46444,46444,46445,46446,46446,46447,46448,46449,46449,46450,46451,46451,
+46452,46453,46453,46454,46455,46455,46456,46457,46457,46458,46459,46460,46460,
+46461,46462,46462,46463,46464,46464,46465,46466,46466,46467,46468,46469,46469,
+46470,46471,46471,46472,46473,46473,46474,46475,46475,46476,46477,46478,46478,
+46479,46480,46480,46481,46482,46482,46483,46484,46484,46485,46486,46486,46487,
+46488,46489,46489,46490,46491,46491,46492,46493,46493,46494,46495,46495,46496,
+46497,46498,46498,46499,46500,46500,46501,46502,46502,46503,46504,46504,46505,
+46506,46506,46507,46508,46509,46509,46510,46511,46511,46512,46513,46513,46514,
+46515,46515,46516,46517,46518,46518,46519,46520,46520,46521,46522,46522,46523,
+46524,46524,46525,46526,46526,46527,46528,46529,46529,46530,46531,46531,46532,
+46533,46533,46534,46535,46535,46536,46537,46538,46538,46539,46540,46540,46541,
+46542,46542,46543,46544,46544,46545,46546,46546,46547,46548,46549,46549,46550,
+46551,46551,46552,46553,46553,46554,46555,46555,46556,46557,46558,46558,46559,
+46560,46560,46561,46562,46562,46563,46564,46564,46565,46566,46566,46567,46568,
+46569,46569,46570,46571,46571,46572,46573,46573,46574,46575,46575,46576,46577,
+46577,46578,46579,46580,46580,46581,46582,46582,46583,46584,46584,46585,46586,
+46586,46587,46588,46588,46589,46590,46591,46591,46592,46593,46593,46594,46595,
+46595,46596,46597,46597,46598,46599,46600,46600,46601,46602,46602,46603,46604,
+46604,46605,46606,46606,46607,46608,46608,46609,46610,46611,46611,46612,46613,
+46613,46614,46615,46615,46616,46617,46617,46618,46619,46619,46620,46621,46622,
+46622,46623,46624,46624,46625,46626,46626,46627,46628,46628,46629,46630,46630,
+46631,46632,46633,46633,46634,46635,46635,46636,46637,46637,46638,46639,46639,
+46640,46641,46641,46642,46643,46644,46644,46645,46646,46646,46647,46648,46648,
+46649,46650,46650,46651,46652,46652,46653,46654,46655,46655,46656,46657,46657,
+46658,46659,46659,46660,46661,46661,46662,46663,46663,46664,46665,46665,46666,
+46667,46668,46668,46669,46670,46670,46671,46672,46672,46673,46674,46674,46675,
+46676,46676,46677,46678,46679,46679,46680,46681,46681,46682,46683,46683,46684,
+46685,46685,46686,46687,46687,46688,46689,46690,46690,46691,46692,46692,46693,
+46694,46694,46695,46696,46696,46697,46698,46698,46699,46700,46701,46701,46702,
+46703,46703,46704,46705,46705,46706,46707,46707,46708,46709,46709,46710,46711,
+46711,46712,46713,46714,46714,46715,46716,46716,46717,46718,46718,46719,46720,
+46720,46721,46722,46722,46723,46724,46725,46725,46726,46727,46727,46728,46729,
+46729,46730,46731,46731,46732,46733,46733,46734,46735,46735,46736,46737,46738,
+46738,46739,46740,46740,46741,46742,46742,46743,46744,46744,46745,46746,46746,
+46747,46748,46749,46749,46750,46751,46751,46752,46753,46753,46754,46755,46755,
+46756,46757,46757,46758,46759,46759,46760,46761,46762,46762,46763,46764,46764,
+46765,46766,46766,46767,46768,46768,46769,46770,46770,46771,46772,46772,46773,
+46774,46775,46775,46776,46777,46777,46778,46779,46779,46780,46781,46781,46782,
+46783,46783,46784,46785,46785,46786,46787,46788,46788,46789,46790,46790,46791,
+46792,46792,46793,46794,46794,46795,46796,46796,46797,46798,46798,46799,46800,
+46801,46801,46802,46803,46803,46804,46805,46805,46806,46807,46807,46808,46809,
+46809,46810,46811,46811,46812,46813,46814,46814,46815,46816,46816,46817,46818,
+46818,46819,46820,46820,46821,46822,46822,46823,46824,46824,46825,46826,46827,
+46827,46828,46829,46829,46830,46831,46831,46832,46833,46833,46834,46835,46835,
+46836,46837,46837,46838,46839,46840,46840,46841,46842,46842,46843,46844,46844,
+46845,46846,46846,46847,46848,46848,46849,46850,46850,46851,46852,46853,46853,
+46854,46855,46855,46856,46857,46857,46858,46859,46859,46860,46861,46861,46862,
+46863,46863,46864,46865,46865,46866,46867,46868,46868,46869,46870,46870,46871,
+46872,46872,46873,46874,46874,46875,46876,46876,46877,46878,46878,46879,46880,
+46881,46881,46882,46883,46883,46884,46885,46885,46886,46887,46887,46888,46889,
+46889,46890,46891,46891,46892,46893,46893,46894,46895,46896,46896,46897,46898,
+46898,46899,46900,46900,46901,46902,46902,46903,46904,46904,46905,46906,46906,
+46907,46908,46908,46909,46910,46911,46911,46912,46913,46913,46914,46915,46915,
+46916,46917,46917,46918,46919,46919,46920,46921,46921,46922,46923,46923,46924,
+46925,46926,46926,46927,46928,46928,46929,46930,46930,46931,46932,46932,46933,
+46934,46934,46935,46936,46936,46937,46938,46938,46939,46940,46941,46941,46942,
+46943,46943,46944,46945,46945,46946,46947,46947,46948,46949,46949,46950,46951,
+46951,46952,46953,46953,46954,46955,46956,46956,46957,46958,46958,46959,46960,
+46960,46961,46962,46962,46963,46964,46964,46965,46966,46966,46967,46968,46968,
+46969,46970,46971,46971,46972,46973,46973,46974,46975,46975,46976,46977,46977,
+46978,46979,46979,46980,46981,46981,46982,46983,46983,46984,46985,46985,46986,
+46987,46988,46988,46989,46990,46990,46991,46992,46992,46993,46994,46994,46995,
+46996,46996,46997,46998,46998,46999,47000,47000,47001,47002,47003,47003,47004,
+47005,47005,47006,47007,47007,47008,47009,47009,47010,47011,47011,47012,47013,
+47013,47014,47015,47015,47016,47017,47017,47018,47019,47020,47020,47021,47022,
+47022,47023,47024,47024,47025,47026,47026,47027,47028,47028,47029,47030,47030,
+47031,47032,47032,47033,47034,47034,47035,47036,47037,47037,47038,47039,47039,
+47040,47041,47041,47042,47043,47043,47044,47045,47045,47046,47047,47047,47048,
+47049,47049,47050,47051,47051,47052,47053,47054,47054,47055,47056,47056,47057,
+47058,47058,47059,47060,47060,47061,47062,47062,47063,47064,47064,47065,47066,
+47066,47067,47068,47068,47069,47070,47070,47071,47072,47073,47073,47074,47075,
+47075,47076,47077,47077,47078,47079,47079,47080,47081,47081,47082,47083,47083,
+47084,47085,47085,47086,47087,47087,47088,47089,47089,47090,47091,47092,47092,
+47093,47094,47094,47095,47096,47096,47097,47098,47098,47099,47100,47100,47101,
+47102,47102,47103,47104,47104,47105,47106,47106,47107,47108,47108,47109,47110,
+47111,47111,47112,47113,47113,47114,47115,47115,47116,47117,47117,47118,47119,
+47119,47120,47121,47121,47122,47123,47123,47124,47125,47125,47126,47127,47127,
+47128,47129,47130,47130,47131,47132,47132,47133,47134,47134,47135,47136,47136,
+47137,47138,47138,47139,47140,47140,47141,47142,47142,47143,47144,47144,47145,
+47146,47146,47147,47148,47149,47149,47150,47151,47151,47152,47153,47153,47154,
+47155,47155,47156,47157,47157,47158,47159,47159,47160,47161,47161,47162,47163,
+47163,47164,47165,47165,47166,47167,47167,47168,47169,47170,47170,47171,47172,
+47172,47173,47174,47174,47175,47176,47176,47177,47178,47178,47179,47180,47180,
+47181,47182,47182,47183,47184,47184,47185,47186,47186,47187,47188,47188,47189,
+47190,47190,47191,47192,47193,47193,47194,47195,47195,47196,47197,47197,47198,
+47199,47199,47200,47201,47201,47202,47203,47203,47204,47205,47205,47206,47207,
+47207,47208,47209,47209,47210,47211,47211,47212,47213,47214,47214,47215,47216,
+47216,47217,47218,47218,47219,47220,47220,47221,47222,47222,47223,47224,47224,
+47225,47226,47226,47227,47228,47228,47229,47230,47230,47231,47232,47232,47233,
+47234,47234,47235,47236,47236,47237,47238,47239,47239,47240,47241,47241,47242,
+47243,47243,47244,47245,47245,47246,47247,47247,47248,47249,47249,47250,47251,
+47251,47252,47253,47253,47254,47255,47255,47256,47257,47257,47258,47259,47259,
+47260,47261,47261,47262,47263,47264,47264,47265,47266,47266,47267,47268,47268,
+47269,47270,47270,47271,47272,47272,47273,47274,47274,47275,47276,47276,47277,
+47278,47278,47279,47280,47280,47281,47282,47282,47283,47284,47284,47285,47286,
+47286,47287,47288,47289,47289,47290,47291,47291,47292,47293,47293,47294,47295,
+47295,47296,47297,47297,47298,47299,47299,47300,47301,47301,47302,47303,47303,
+47304,47305,47305,47306,47307,47307,47308,47309,47309,47310,47311,47311,47312,
+47313,47313,47314,47315,47316,47316,47317,47318,47318,47319,47320,47320,47321,
+47322,47322,47323,47324,47324,47325,47326,47326,47327,47328,47328,47329,47330,
+47330,47331,47332,47332,47333,47334,47334,47335,47336,47336,47337,47338,47338,
+47339,47340,47340,47341,47342,47342,47343,47344,47344,47345,47346,47347,47347,
+47348,47349,47349,47350,47351,47351,47352,47353,47353,47354,47355,47355,47356,
+47357,47357,47358,47359,47359,47360,47361,47361,47362,47363,47363,47364,47365,
+47365,47366,47367,47367,47368,47369,47369,47370,47371,47371,47372,47373,47373,
+47374,47375,47375,47376,47377,47378,47378,47379,47380,47380,47381,47382,47382,
+47383,47384,47384,47385,47386,47386,47387,47388,47388,47389,47390,47390,47391,
+47392,47392,47393,47394,47394,47395,47396,47396,47397,47398,47398,47399,47400,
+47400,47401,47402,47402,47403,47404,47404,47405,47406,47406,47407,47408,47408,
+47409,47410,47410,47411,47412,47413,47413,47414,47415,47415,47416,47417,47417,
+47418,47419,47419,47420,47421,47421,47422,47423,47423,47424,47425,47425,47426,
+47427,47427,47428,47429,47429,47430,47431,47431,47432,47433,47433,47434,47435,
+47435,47436,47437,47437,47438,47439,47439,47440,47441,47441,47442,47443,47443,
+47444,47445,47445,47446,47447,47447,47448,47449,47449,47450,47451,47452,47452,
+47453,47454,47454,47455,47456,47456,47457,47458,47458,47459,47460,47460,47461,
+47462,47462,47463,47464,47464,47465,47466,47466,47467,47468,47468,47469,47470,
+47470,47471,47472,47472,47473,47474,47474,47475,47476,47476,47477,47478,47478,
+47479,47480,47480,47481,47482,47482,47483,47484,47484,47485,47486,47486,47487,
+47488,47488,47489,47490,47490,47491,47492,47492,47493,47494,47494,47495,47496,
+47497,47497,47498,47499,47499,47500,47501,47501,47502,47503,47503,47504,47505,
+47505,47506,47507,47507,47508,47509,47509,47510,47511,47511,47512,47513,47513,
+47514,47515,47515,47516,47517,47517,47518,47519,47519,47520,47521,47521,47522,
+47523,47523,47524,47525,47525,47526,47527,47527,47528,47529,47529,47530,47531,
+47531,47532,47533,47533,47534,47535,47535,47536,47537,47537,47538,47539,47539,
+47540,47541,47541,47542,47543,47543,47544,47545,47545,47546,47547,47547,47548,
+47549,47549,47550,47551,47552,47552,47553,47554,47554,47555,47556,47556,47557,
+47558,47558,47559,47560,47560,47561,47562,47562,47563,47564,47564,47565,47566,
+47566,47567,47568,47568,47569,47570,47570,47571,47572,47572,47573,47574,47574,
+47575,47576,47576,47577,47578,47578,47579,47580,47580,47581,47582,47582,47583,
+47584,47584,47585,47586,47586,47587,47588,47588,47589,47590,47590,47591,47592,
+47592,47593,47594,47594,47595,47596,47596,47597,47598,47598,47599,47600,47600,
+47601,47602,47602,47603,47604,47604,47605,47606,47606,47607,47608,47608,47609,
+47610,47610,47611,47612,47612,47613,47614,47614,47615,47616,47616,47617,47618,
+47618,47619,47620,47620,47621,47622,47622,47623,47624,47624,47625,47626,47626,
+47627,47628,47628,47629,47630,47631,47631,47632,47633,47633,47634,47635,47635,
+47636,47637,47637,47638,47639,47639,47640,47641,47641,47642,47643,47643,47644,
+47645,47645,47646,47647,47647,47648,47649,47649,47650,47651,47651,47652,47653,
+47653,47654,47655,47655,47656,47657,47657,47658,47659,47659,47660,47661,47661,
+47662,47663,47663,47664,47665,47665,47666,47667,47667,47668,47669,47669,47670,
+47671,47671,47672,47673,47673,47674,47675,47675,47676,47677,47677,47678,47679,
+47679,47680,47681,47681,47682,47683,47683,47684,47685,47685,47686,47687,47687,
+47688,47689,47689,47690,47691,47691,47692,47693,47693,47694,47695,47695,47696,
+47697,47697,47698,47699,47699,47700,47701,47701,47702,47703,47703,47704,47705,
+47705,47706,47707,47707,47708,47709,47709,47710,47711,47711,47712,47713,47713,
+47714,47715,47715,47716,47717,47717,47718,47719,47719,47720,47721,47721,47722,
+47723,47723,47724,47725,47725,47726,47727,47727,47728,47729,47729,47730,47731,
+47731,47732,47733,47733,47734,47735,47735,47736,47737,47737,47738,47739,47739,
+47740,47741,47741,47742,47743,47743,47744,47745,47745,47746,47747,47747,47748,
+47749,47749,47750,47751,47751,47752,47753,47753,47754,47755,47755,47756,47757,
+47757,47758,47759,47759,47760,47761,47761,47762,47763,47763,47764,47765,47765,
+47766,47767,47767,47768,47769,47769,47770,47771,47771,47772,47773,47773,47774,
+47775,47775,47776,47777,47777,47778,47779,47779,47780,47781,47781,47782,47783,
+47783,47784,47785,47785,47786,47787,47787,47788,47789,47789,47790,47791,47791,
+47792,47793,47793,47794,47795,47795,47796,47797,47797,47798,47799,47799,47800,
+47801,47801,47802,47803,47803,47804,47805,47805,47806,47807,47807,47808,47809,
+47809,47810,47811,47811,47812,47813,47813,47814,47815,47815,47816,47817,47817,
+47818,47819,47819,47820,47821,47821,47822,47823,47823,47824,47825,47825,47826,
+47827,47827,47828,47829,47829,47830,47831,47831,47832,47833,47833,47834,47835,
+47835,47836,47837,47837,47838,47839,47839,47840,47841,47841,47842,47843,47843,
+47844,47845,47845,47846,47847,47847,47848,47849,47849,47850,47851,47851,47852,
+47853,47853,47854,47855,47855,47856,47857,47857,47858,47859,47859,47860,47860,
+47861,47862,47862,47863,47864,47864,47865,47866,47866,47867,47868,47868,47869,
+47870,47870,47871,47872,47872,47873,47874,47874,47875,47876,47876,47877,47878,
+47878,47879,47880,47880,47881,47882,47882,47883,47884,47884,47885,47886,47886,
+47887,47888,47888,47889,47890,47890,47891,47892,47892,47893,47894,47894,47895,
+47896,47896,47897,47898,47898,47899,47900,47900,47901,47902,47902,47903,47904,
+47904,47905,47906,47906,47907,47908,47908,47909,47910,47910,47911,47912,47912,
+47913,47914,47914,47915,47916,47916,47917,47918,47918,47919,47920,47920,47921,
+47922,47922,47923,47924,47924,47925,47926,47926,47927,47928,47928,47929,47930,
+47930,47931,47932,47932,47933,47934,47934,47935,47936,47936,47937,47938,47938,
+47939,47939,47940,47941,47941,47942,47943,47943,47944,47945,47945,47946,47947,
+47947,47948,47949,47949,47950,47951,47951,47952,47953,47953,47954,47955,47955,
+47956,47957,47957,47958,47959,47959,47960,47961,47961,47962,47963,47963,47964,
+47965,47965,47966,47967,47967,47968,47969,47969,47970,47971,47971,47972,47973,
+47973,47974,47975,47975,47976,47977,47977,47978,47979,47979,47980,47981,47981,
+47982,47983,47983,47984,47985,47985,47986,47987,47987,47988,47989,47989,47990,
+47991,47991,47992,47993,47993,47994,47994,47995,47996,47996,47997,47998,47998,
+47999,48000,48000,48001,48002,48002,48003,48004,48004,48005,48006,48006,48007,
+48008,48008,48009,48010,48010,48011,48012,48012,48013,48014,48014,48015,48016,
+48016,48017,48018,48018,48019,48020,48020,48021,48022,48022,48023,48024,48024,
+48025,48026,48026,48027,48028,48028,48029,48030,48030,48031,48032,48032,48033,
+48034,48034,48035,48036,48036,48037,48038,48038,48039,48039,48040,48041,48041,
+48042,48043,48043,48044,48045,48045,48046,48047,48047,48048,48049,48049,48050,
+48051,48051,48052,48053,48053,48054,48055,48055,48056,48057,48057,48058,48059,
+48059,48060,48061,48061,48062,48063,48063,48064,48065,48065,48066,48067,48067,
+48068,48069,48069,48070,48071,48071,48072,48073,48073,48074,48075,48075,48076,
+48077,48077,48078,48078,48079,48080,48080,48081,48082,48082,48083,48084,48084,
+48085,48086,48086,48087,48088,48088,48089,48090,48090,48091,48092,48092,48093,
+48094,48094,48095,48096,48096,48097,48098,48098,48099,48100,48100,48101,48102,
+48102,48103,48104,48104,48105,48106,48106,48107,48108,48108,48109,48110,48110,
+48111,48112,48112,48113,48113,48114,48115,48115,48116,48117,48117,48118,48119,
+48119,48120,48121,48121,48122,48123,48123,48124,48125,48125,48126,48127,48127,
+48128,48129,48129,48130,48131,48131,48132,48133,48133,48134,48135,48135,48136,
+48137,48137,48138,48139,48139,48140,48141,48141,48142,48143,48143,48144,48144,
+48145,48146,48146,48147,48148,48148,48149,48150,48150,48151,48152,48152,48153,
+48154,48154,48155,48156,48156,48157,48158,48158,48159,48160,48160,48161,48162,
+48162,48163,48164,48164,48165,48166,48166,48167,48168,48168,48169,48170,48170,
+48171,48172,48172,48173,48173,48174,48175,48175,48176,48177,48177,48178,48179,
+48179,48180,48181,48181,48182,48183,48183,48184,48185,48185,48186,48187,48187,
+48188,48189,48189,48190,48191,48191,48192,48193,48193,48194,48195,48195,48196,
+48197,48197,48198,48199,48199,48200,48201,48201,48202,48202,48203,48204,48204,
+48205,48206,48206,48207,48208,48208,48209,48210,48210,48211,48212,48212,48213,
+48214,48214,48215,48216,48216,48217,48218,48218,48219,48220,48220,48221,48222,
+48222,48223,48224,48224,48225,48226,48226,48227,48228,48228,48229,48229,48230,
+48231,48231,48232,48233,48233,48234,48235,48235,48236,48237,48237,48238,48239,
+48239,48240,48241,48241,48242,48243,48243,48244,48245,48245,48246,48247,48247,
+48248,48249,48249,48250,48251,48251,48252,48252,48253,48254,48254,48255,48256,
+48256,48257,48258,48258,48259,48260,48260,48261,48262,48262,48263,48264,48264,
+48265,48266,48266,48267,48268,48268,48269,48270,48270,48271,48272,48272,48273,
+48274,48274,48275,48276,48276,48277,48277,48278,48279,48279,48280,48281,48281,
+48282,48283,48283,48284,48285,48285,48286,48287,48287,48288,48289,48289,48290,
+48291,48291,48292,48293,48293,48294,48295,48295,48296,48297,48297,48298,48298,
+48299,48300,48300,48301,48302,48302,48303,48304,48304,48305,48306,48306,48307,
+48308,48308,48309,48310,48310,48311,48312,48312,48313,48314,48314,48315,48316,
+48316,48317,48318,48318,48319,48320,48320,48321,48321,48322,48323,48323,48324,
+48325,48325,48326,48327,48327,48328,48329,48329,48330,48331,48331,48332,48333,
+48333,48334,48335,48335,48336,48337,48337,48338,48339,48339,48340,48341,48341,
+48342,48342,48343,48344,48344,48345,48346,48346,48347,48348,48348,48349,48350,
+48350,48351,48352,48352,48353,48354,48354,48355,48356,48356,48357,48358,48358,
+48359,48360,48360,48361,48361,48362,48363,48363,48364,48365,48365,48366,48367,
+48367,48368,48369,48369,48370,48371,48371,48372,48373,48373,48374,48375,48375,
+48376,48377,48377,48378,48379,48379,48380,48380,48381,48382,48382,48383,48384,
+48384,48385,48386,48386,48387,48388,48388,48389,48390,48390,48391,48392,48392,
+48393,48394,48394,48395,48396,48396,48397,48398,48398,48399,48399,48400,48401,
+48401,48402,48403,48403,48404,48405,48405,48406,48407,48407,48408,48409,48409,
+48410,48411,48411,48412,48413,48413,48414,48415,48415,48416,48417,48417,48418,
+48418,48419,48420,48420,48421,48422,48422,48423,48424,48424,48425,48426,48426,
+48427,48428,48428,48429,48430,48430,48431,48432,48432,48433,48434,48434,48435,
+48435,48436,48437,48437,48438,48439,48439,48440,48441,48441,48442,48443,48443,
+48444,48445,48445,48446,48447,48447,48448,48449,48449,48450,48451,48451,48452,
+48453,48453,48454,48454,48455,48456,48456,48457,48458,48458,48459,48460,48460,
+48461,48462,48462,48463,48464,48464,48465,48466,48466,48467,48468,48468,48469,
+48470,48470,48471,48471,48472,48473,48473,48474,48475,48475,48476,48477,48477,
+48478,48479,48479,48480,48481,48481,48482,48483,48483,48484,48485,48485,48486,
+48486,48487,48488,48488,48489,48490,48490,48491,48492,48492,48493,48494,48494,
+48495,48496,48496,48497,48498,48498,48499,48500,48500,48501,48502,48502,48503,
+48503,48504,48505,48505,48506,48507,48507,48508,48509,48509,48510,48511,48511,
+48512,48513,48513,48514,48515,48515,48516,48517,48517,48518,48518,48519,48520,
+48520,48521,48522,48522,48523,48524,48524,48525,48526,48526,48527,48528,48528,
+48529,48530,48530,48531,48532,48532,48533,48534,48534,48535,48535,48536,48537,
+48537,48538,48539,48539,48540,48541,48541,48542,48543,48543,48544,48545,48545,
+48546,48547,48547,48548,48549,48549,48550,48550,48551,48552,48552,48553,48554,
+48554,48555,48556,48556,48557,48558,48558,48559,48560,48560,48561,48562,48562,
+48563,48564,48564,48565,48565,48566,48567,48567,48568,48569,48569,48570,48571,
+48571,48572,48573,48573,48574,48575,48575,48576,48577,48577,48578,48579,48579,
+48580,48580,48581,48582,48582,48583,48584,48584,48585,48586,48586,48587,48588,
+48588,48589,48590,48590,48591,48592,48592,48593,48593,48594,48595,48595,48596,
+48597,48597,48598,48599,48599,48600,48601,48601,48602,48603,48603,48604,48605,
+48605,48606,48607,48607,48608,48608,48609,48610,48610,48611,48612,48612,48613,
+48614,48614,48615,48616,48616,48617,48618,48618,48619,48620,48620,48621,48622,
+48622,48623,48623,48624,48625,48625,48626,48627,48627,48628,48629,48629,48630,
+48631,48631,48632,48633,48633,48634,48635,48635,48636,48636,48637,48638,48638,
+48639,48640,48640,48641,48642,48642,48643,48644,48644,48645,48646,48646,48647,
+48648,48648,48649,48649,48650,48651,48651,48652,48653,48653,48654,48655,48655,
+48656,48657,48657,48658,48659,48659,48660,48661,48661,48662,48662,48663,48664,
+48664,48665,48666,48666,48667,48668,48668,48669,48670,48670,48671,48672,48672,
+48673,48674,48674,48675,48676,48676,48677,48677,48678,48679,48679,48680,48681,
+48681,48682,48683,48683,48684,48685,48685,48686,48687,48687,48688,48689,48689,
+48690,48690,48691,48692,48692,48693,48694,48694,48695,48696,48696,48697,48698,
+48698,48699,48700,48700,48701,48701,48702,48703,48703,48704,48705,48705,48706,
+48707,48707,48708,48709,48709,48710,48711,48711,48712,48713,48713,48714,48714,
+48715,48716,48716,48717,48718,48718,48719,48720,48720,48721,48722,48722,48723,
+48724,48724,48725,48726,48726,48727,48727,48728,48729,48729,48730,48731,48731,
+48732,48733,48733,48734,48735,48735,48736,48737,48737,48738,48739,48739,48740,
+48740,48741,48742,48742,48743,48744,48744,48745,48746,48746,48747,48748,48748,
+48749,48750,48750,48751,48751,48752,48753,48753,48754,48755,48755,48756,48757,
+48757,48758,48759,48759,48760,48761,48761,48762,48763,48763,48764,48764,48765,
+48766,48766,48767,48768,48768,48769,48770,48770,48771,48772,48772,48773,48774,
+48774,48775,48775,48776,48777,48777,48778,48779,48779,48780,48781,48781,48782,
+48783,48783,48784,48785,48785,48786,48787,48787,48788,48788,48789,48790,48790,
+48791,48792,48792,48793,48794,48794,48795,48796,48796,48797,48798,48798,48799,
+48799,48800,48801,48801,48802,48803,48803,48804,48805,48805,48806,48807,48807,
+48808,48809,48809,48810,48810,48811,48812,48812,48813,48814,48814,48815,48816,
+48816,48817,48818,48818,48819,48820,48820,48821,48821,48822,48823,48823,48824,
+48825,48825,48826,48827,48827,48828,48829,48829,48830,48831,48831,48832,48832,
+48833,48834,48834,48835,48836,48836,48837,48838,48838,48839,48840,48840,48841,
+48842,48842,48843,48843,48844,48845,48845,48846,48847,48847,48848,48849,48849,
+48850,48851,48851,48852,48853,48853,48854,48854,48855,48856,48856,48857,48858,
+48858,48859,48860,48860,48861,48862,48862,48863,48864,48864,48865,48865,48866,
+48867,48867,48868,48869,48869,48870,48871,48871,48872,48873,48873,48874,48875,
+48875,48876,48876,48877,48878,48878,48879,48880,48880,48881,48882,48882,48883,
+48884,48884,48885,48886,48886,48887,48887,48888,48889,48889,48890,48891,48891,
+48892,48893,48893,48894,48895,48895,48896,48897,48897,48898,48898,48899,48900,
+48900,48901,48902,48902,48903,48904,48904,48905,48906,48906,48907,48908,48908,
+48909,48909,48910,48911,48911,48912,48913,48913,48914,48915,48915,48916,48917,
+48917,48918,48918,48919,48920,48920,48921,48922,48922,48923,48924,48924,48925,
+48926,48926,48927,48928,48928,48929,48929,48930,48931,48931,48932,48933,48933,
+48934,48935,48935,48936,48937,48937,48938,48939,48939,48940,48940,48941,48942,
+48942,48943,48944,48944,48945,48946,48946,48947,48948,48948,48949,48949,48950,
+48951,48951,48952,48953,48953,48954,48955,48955,48956,48957,48957,48958,48959,
+48959,48960,48960,48961,48962,48962,48963,48964,48964,48965,48966,48966,48967,
+48968,48968,48969,48969,48970,48971,48971,48972,48973,48973,48974,48975,48975,
+48976,48977,48977,48978,48979,48979,48980,48980,48981,48982,48982,48983,48984,
+48984,48985,48986,48986,48987,48988,48988,48989,48989,48990,48991,48991,48992,
+48993,48993,48994,48995,48995,48996,48997,48997,48998,48999,48999,49000,49000,
+49001,49002,49002,49003,49004,49004,49005,49006,49006,49007,49008,49008,49009,
+49009,49010,49011,49011,49012,49013,49013,49014,49015,49015,49016,49017,49017,
+49018,49018,49019,49020,49020,49021,49022,49022,49023,49024,49024,49025,49026,
+49026,49027,49027,49028,49029,49029,49030,49031,49031,49032,49033,49033,49034,
+49035,49035,49036,49037,49037,49038,49038,49039,49040,49040,49041,49042,49042,
+49043,49044,49044,49045,49046,49046,49047,49047,49048,49049,49049,49050,49051,
+49051,49052,49053,49053,49054,49055,49055,49056,49056,49057,49058,49058,49059,
+49060,49060,49061,49062,49062,49063,49064,49064,49065,49065,49066,49067,49067,
+49068,49069,49069,49070,49071,49071,49072,49073,49073,49074,49074,49075,49076,
+49076,49077,49078,49078,49079,49080,49080,49081,49082,49082,49083,49083,49084,
+49085,49085,49086,49087,49087,49088,49089,49089,49090,49091,49091,49092,49092,
+49093,49094,49094,49095,49096,49096,49097,49098,49098,49099,49100,49100,49101,
+49101,49102,49103,49103,49104,49105,49105,49106,49107,49107,49108,49109,49109,
+49110,49110,49111,49112,49112,49113,49114,49114,49115,49116,49116,49117,49118,
+49118,49119,49119,49120,49121,49121,49122,49123,49123,49124,49125,49125,49126,
+49127,49127,49128,49128,49129,49130,49130,49131,49132,49132,49133,49134,49134,
+49135,49136,49136,49137,49137,49138,49139,49139,49140,49141,49141,49142,49143,
+49143,49144,49145,49145,49146,49146,49147,49148,49148,49149,49150,49150,49151,
+49152,49152,49153,49154,49154,49155,49155,49156,49157,49157,49158,49159,49159,
+49160,49161,49161,49162,49163,49163,49164,49164,49165,49166,49166,49167,49168,
+49168,49169,49170,49170,49171,49171,49172,49173,49173,49174,49175,49175,49176,
+49177,49177,49178,49179,49179,49180,49180,49181,49182,49182,49183,49184,49184,
+49185,49186,49186,49187,49188,49188,49189,49189,49190,49191,49191,49192,49193,
+49193,49194,49195,49195,49196,49196,49197,49198,49198,49199,49200,49200,49201,
+49202,49202,49203,49204,49204,49205,49205,49206,49207,49207,49208,49209,49209,
+49210,49211,49211,49212,49213,49213,49214,49214,49215,49216,49216,49217,49218,
+49218,49219,49220,49220,49221,49221,49222,49223,49223,49224,49225,49225,49226,
+49227,49227,49228,49229,49229,49230,49230,49231,49232,49232,49233,49234,49234,
+49235,49236,49236,49237,49238,49238,49239,49239,49240,49241,49241,49242,49243,
+49243,49244,49245,49245,49246,49246,49247,49248,49248,49249,49250,49250,49251,
+49252,49252,49253,49254,49254,49255,49255,49256,49257,49257,49258,49259,49259,
+49260,49261,49261,49262,49262,49263,49264,49264,49265,49266,49266,49267,49268,
+49268,49269,49270,49270,49271,49271,49272,49273,49273,49274,49275,49275,49276,
+49277,49277,49278,49278,49279,49280,49280,49281,49282,49282,49283,49284,49284,
+49285,49286,49286,49287,49287,49288,49289,49289,49290,49291,49291,49292,49293,
+49293,49294,49294,49295,49296,49296,49297,49298,49298,49299,49300,49300,49301,
+49301,49302,49303,49303,49304,49305,49305,49306,49307,49307,49308,49309,49309,
+49310,49310,49311,49312,49312,49313,49314,49314,49315,49316,49316,49317,49317,
+49318,49319,49319,49320,49321,49321,49322,49323,49323,49324,49325,49325,49326,
+49326,49327,49328,49328,49329,49330,49330,49331,49332,49332,49333,49333,49334,
+49335,49335,49336,49337,49337,49338,49339,49339,49340,49340,49341,49342,49342,
+49343,49344,49344,49345,49346,49346,49347,49348,49348,49349,49349,49350,49351,
+49351,49352,49353,49353,49354,49355,49355,49356,49356,49357,49358,49358,49359,
+49360,49360,49361,49362,49362,49363,49363,49364,49365,49365,49366,49367,49367,
+49368,49369,49369,49370,49370,49371,49372,49372,49373,49374,49374,49375,49376,
+49376,49377,49378,49378,49379,49379,49380,49381,49381,49382,49383,49383,49384,
+49385,49385,49386,49386,49387,49388,49388,49389,49390,49390,49391,49392,49392,
+49393,49393,49394,49395,49395,49396,49397,49397,49398,49399,49399,49400,49400,
+49401,49402,49402,49403,49404,49404,49405,49406,49406,49407,49407,49408,49409,
+49409,49410,49411,49411,49412,49413,49413,49414,49414,49415,49416,49416,49417,
+49418,49418,49419,49420,49420,49421,49422,49422,49423,49423,49424,49425,49425,
+49426,49427,49427,49428,49429,49429,49430,49430,49431,49432,49432,49433,49434,
+49434,49435,49436,49436,49437,49437,49438,49439,49439,49440,49441,49441,49442,
+49443,49443,49444,49444,49445,49446,49446,49447,49448,49448,49449,49450,49450,
+49451,49451,49452,49453,49453,49454,49455,49455,49456,49457,49457,49458,49458,
+49459,49460,49460,49461,49462,49462,49463,49464,49464,49465,49465,49466,49467,
+49467,49468,49469,49469,49470,49471,49471,49472,49472,49473,49474,49474,49475,
+49476,49476,49477,49478,49478,49479,49479,49480,49481,49481,49482,49483,49483,
+49484,49485,49485,49486,49486,49487,49488,49488,49489,49490,49490,49491,49492,
+49492,49493,49493,49494,49495,49495,49496,49497,49497,49498,49499,49499,49500,
+49500,49501,49502,49502,49503,49504,49504,49505,49506,49506,49507,49507,49508,
+49509,49509,49510,49511,49511,49512,49513,49513,49514,49514,49515,49516,49516,
+49517,49518,49518,49519,49520,49520,49521,49521,49522,49523,49523,49524,49525,
+49525,49526,49527,49527,49528,49528,49529,49530,49530,49531,49532,49532,49533,
+49534,49534,49535,49535,49536,49537,49537,49538,49539,49539,49540,49541,49541,
+49542,49542,49543,49544,49544,49545,49546,49546,49547,49547,49548,49549,49549,
+49550,49551,49551,49552,49553,49553,49554,49554,49555,49556,49556,49557,49558,
+49558,49559,49560,49560,49561,49561,49562,49563,49563,49564,49565,49565,49566,
+49567,49567,49568,49568,49569,49570,49570,49571,49572,49572,49573,49574,49574,
+49575,49575,49576,49577,49577,49578,49579,49579,49580,49581,49581,49582,49582,
+49583,49584,49584,49585,49586,49586,49587,49587,49588,49589,49589,49590,49591,
+49591,49592,49593,49593,49594,49594,49595,49596,49596,49597,49598,49598,49599,
+49600,49600,49601,49601,49602,49603,49603,49604,49605,49605,49606,49607,49607,
+49608,49608,49609,49610,49610,49611,49612,49612,49613,49614,49614,49615,49615,
+49616,49617,49617,49618,49619,49619,49620,49620,49621,49622,49622,49623,49624,
+49624,49625,49626,49626,49627,49627,49628,49629,49629,49630,49631,49631,49632,
+49633,49633,49634,49634,49635,49636,49636,49637,49638,49638,49639,49639,49640,
+49641,49641,49642,49643,49643,49644,49645,49645,49646,49646,49647,49648,49648,
+49649,49650,49650,49651,49652,49652,49653,49653,49654,49655,49655,49656,49657,
+49657,49658,49658,49659,49660,49660,49661,49662,49662,49663,49664,49664,49665,
+49665,49666,49667,49667,49668,49669,49669,49670,49671,49671,49672,49672,49673,
+49674,49674,49675,49676,49676,49677,49677,49678,49679,49679,49680,49681,49681,
+49682,49683,49683,49684,49684,49685,49686,49686,49687,49688,49688,49689,49690,
+49690,49691,49691,49692,49693,49693,49694,49695,49695,49696,49696,49697,49698,
+49698,49699,49700,49700,49701,49702,49702,49703,49703,49704,49705,49705,49706,
+49707,49707,49708,49709,49709,49710,49710,49711,49712,49712,49713,49714,49714,
+49715,49715,49716,49717,49717,49718,49719,49719,49720,49721,49721,49722,49722,
+49723,49724,49724,49725,49726,49726,49727,49727,49728,49729,49729,49730,49731,
+49731,49732,49733,49733,49734,49734,49735,49736,49736,49737,49738,49738,49739,
+49739,49740,49741,49741,49742,49743,49743,49744,49745,49745,49746,49746,49747,
+49748,49748,49749,49750,49750,49751,49751,49752,49753,49753,49754,49755,49755,
+49756,49757,49757,49758,49758,49759,49760,49760,49761,49762,49762,49763,49763,
+49764,49765,49765,49766,49767,49767,49768,49769,49769,49770,49770,49771,49772,
+49772,49773,49774,49774,49775,49775,49776,49777,49777,49778,49779,49779,49780,
+49781,49781,49782,49782,49783,49784,49784,49785,49786,49786,49787,49787,49788,
+49789,49789,49790,49791,49791,49792,49793,49793,49794,49794,49795,49796,49796,
+49797,49798,49798,49799,49799,49800,49801,49801,49802,49803,49803,49804,49805,
+49805,49806,49806,49807,49808,49808,49809,49810,49810,49811,49811,49812,49813,
+49813,49814,49815,49815,49816,49817,49817,49818,49818,49819,49820,49820,49821,
+49822,49822,49823,49823,49824,49825,49825,49826,49827,49827,49828,49828,49829,
+49830,49830,49831,49832,49832,49833,49834,49834,49835,49835,49836,49837,49837,
+49838,49839,49839,49840,49840,49841,49842,49842,49843,49844,49844,49845,49846,
+49846,49847,49847,49848,49849,49849,49850,49851,49851,49852,49852,49853,49854,
+49854,49855,49856,49856,49857,49857,49858,49859,49859,49860,49861,49861,49862,
+49863,49863,49864,49864,49865,49866,49866,49867,49868,49868,49869,49869,49870,
+49871,49871,49872,49873,49873,49874,49875,49875,49876,49876,49877,49878,49878,
+49879,49880,49880,49881,49881,49882,49883,49883,49884,49885,49885,49886,49886,
+49887,49888,49888,49889,49890,49890,49891,49892,49892,49893,49893,49894,49895,
+49895,49896,49897,49897,49898,49898,49899,49900,49900,49901,49902,49902,49903,
+49903,49904,49905,49905,49906,49907,49907,49908,49908,49909,49910,49910,49911,
+49912,49912,49913,49914,49914,49915,49915,49916,49917,49917,49918,49919,49919,
+49920,49920,49921,49922,49922,49923,49924,49924,49925,49925,49926,49927,49927,
+49928,49929,49929,49930,49931,49931,49932,49932,49933,49934,49934,49935,49936,
+49936,49937,49937,49938,49939,49939,49940,49941,49941,49942,49942,49943,49944,
+49944,49945,49946,49946,49947,49947,49948,49949,49949,49950,49951,49951,49952,
+49953,49953,49954,49954,49955,49956,49956,49957,49958,49958,49959,49959,49960,
+49961,49961,49962,49963,49963,49964,49964,49965,49966,49966,49967,49968,49968,
+49969,49969,49970,49971,49971,49972,49973,49973,49974,49975,49975,49976,49976,
+49977,49978,49978,49979,49980,49980,49981,49981,49982,49983,49983,49984,49985,
+49985,49986,49986,49987,49988,49988,49989,49990,49990,49991,49991,49992,49993,
+49993,49994,49995,49995,49996,49996,49997,49998,49998,49999,50000,50000,50001,
+50002,50002,50003,50003,50004,50005,50005,50006,50007,50007,50008,50008,50009,
+50010,50010,50011,50012,50012,50013,50013,50014,50015,50015,50016,50017,50017,
+50018,50018,50019,50020,50020,50021,50022,50022,50023,50023,50024,50025,50025,
+50026,50027,50027,50028,50028,50029,50030,50030,50031,50032,50032,50033,50034,
+50034,50035,50035,50036,50037,50037,50038,50039,50039,50040,50040,50041,50042,
+50042,50043,50044,50044,50045,50045,50046,50047,50047,50048,50049,50049,50050,
+50050,50051,50052,50052,50053,50054,50054,50055,50055,50056,50057,50057,50058,
+50059,50059,50060,50060,50061,50062,50062,50063,50064,50064,50065,50065,50066,
+50067,50067,50068,50069,50069,50070,50070,50071,50072,50072,50073,50074,50074,
+50075,50076,50076,50077,50077,50078,50079,50079,50080,50081,50081,50082,50082,
+50083,50084,50084,50085,50086,50086,50087,50087,50088,50089,50089,50090,50091,
+50091,50092,50092,50093,50094,50094,50095,50096,50096,50097,50097,50098,50099,
+50099,50100,50101,50101,50102,50102,50103,50104,50104,50105,50106,50106,50107,
+50107,50108,50109,50109,50110,50111,50111,50112,50112,50113,50114,50114,50115,
+50116,50116,50117,50117,50118,50119,50119,50120,50121,50121,50122,50122,50123,
+50124,50124,50125,50126,50126,50127,50127,50128,50129,50129,50130,50131,50131,
+50132,50132,50133,50134,50134,50135,50136,50136,50137,50137,50138,50139,50139,
+50140,50141,50141,50142,50142,50143,50144,50144,50145,50146,50146,50147,50147,
+50148,50149,50149,50150,50151,50151,50152,50152,50153,50154,50154,50155,50156,
+50156,50157,50157,50158,50159,50159,50160,50161,50161,50162,50162,50163,50164,
+50164,50165,50166,50166,50167,50167,50168,50169,50169,50170,50171,50171,50172,
+50172,50173,50174,50174,50175,50176,50176,50177,50177,50178,50179,50179,50180,
+50181,50181,50182,50182,50183,50184,50184,50185,50186,50186,50187,50187,50188,
+50189,50189,50190,50191,50191,50192,50192,50193,50194,50194,50195,50196,50196,
+50197,50197,50198,50199,50199,50200,50201,50201,50202,50202,50203,50204,50204,
+50205,50206,50206,50207,50207,50208,50209,50209,50210,50211,50211,50212,50212,
+50213,50214,50214,50215,50216,50216,50217,50217,50218,50219,50219,50220,50221,
+50221,50222,50222,50223,50224,50224,50225,50226,50226,50227,50227,50228,50229,
+50229,50230,50231,50231,50232,50232,50233,50234,50234,50235,50236,50236,50237,
+50237,50238,50239,50239,50240,50241,50241,50242,50242,50243,50244,50244,50245,
+50246,50246,50247,50247,50248,50249,50249,50250,50251,50251,50252,50252,50253,
+50254,50254,50255,50256,50256,50257,50257,50258,50259,50259,50260,50261,50261,
+50262,50262,50263,50264,50264,50265,50265,50266,50267,50267,50268,50269,50269,
+50270,50270,50271,50272,50272,50273,50274,50274,50275,50275,50276,50277,50277,
+50278,50279,50279,50280,50280,50281,50282,50282,50283,50284,50284,50285,50285,
+50286,50287,50287,50288,50289,50289,50290,50290,50291,50292,50292,50293,50294,
+50294,50295,50295,50296,50297,50297,50298,50299,50299,50300,50300,50301,50302,
+50302,50303,50304,50304,50305,50305,50306,50307,50307,50308,50308,50309,50310,
+50310,50311,50312,50312,50313,50313,50314,50315,50315,50316,50317,50317,50318,
+50318,50319,50320,50320,50321,50322,50322,50323,50323,50324,50325,50325,50326,
+50327,50327,50328,50328,50329,50330,50330,50331,50332,50332,50333,50333,50334,
+50335,50335,50336,50337,50337,50338,50338,50339,50340,50340,50341,50341,50342,
+50343,50343,50344,50345,50345,50346,50346,50347,50348,50348,50349,50350,50350,
+50351,50351,50352,50353,50353,50354,50355,50355,50356,50356,50357,50358,50358,
+50359,50360,50360,50361,50361,50362,50363,50363,50364,50364,50365,50366,50366,
+50367,50368,50368,50369,50369,50370,50371,50371,50372,50373,50373,50374,50374,
+50375,50376,50376,50377,50378,50378,50379,50379,50380,50381,50381,50382,50383,
+50383,50384,50384,50385,50386,50386,50387,50387,50388,50389,50389,50390,50391,
+50391,50392,50392,50393,50394,50394,50395,50396,50396,50397,50397,50398,50399,
+50399,50400,50401,50401,50402,50402,50403,50404,50404,50405,50406,50406,50407,
+50407,50408,50409,50409,50410,50410,50411,50412,50412,50413,50414,50414,50415,
+50415,50416,50417,50417,50418,50419,50419,50420,50420,50421,50422,50422,50423,
+50424,50424,50425,50425,50426,50427,50427,50428,50428,50429,50430,50430,50431,
+50432,50432,50433,50433,50434,50435,50435,50436,50437,50437,50438,50438,50439,
+50440,50440,50441,50442,50442,50443,50443,50444,50445,50445,50446,50446,50447,
+50448,50448,50449,50450,50450,50451,50451,50452,50453,50453,50454,50455,50455,
+50456,50456,50457,50458,50458,50459,50460,50460,50461,50461,50462,50463,50463,
+50464,50464,50465,50466,50466,50467,50468,50468,50469,50469,50470,50471,50471,
+50472,50473,50473,50474,50474,50475,50476,50476,50477,50477,50478,50479,50479,
+50480,50481,50481,50482,50482,50483,50484,50484,50485,50486,50486,50487,50487,
+50488,50489,50489,50490,50491,50491,50492,50492,50493,50494,50494,50495,50495,
+50496,50497,50497,50498,50499,50499,50500,50500,50501,50502,50502,50503,50504,
+50504,50505,50505,50506,50507,50507,50508,50508,50509,50510,50510,50511,50512,
+50512,50513,50513,50514,50515,50515,50516,50517,50517,50518,50518,50519,50520,
+50520,50521,50521,50522,50523,50523,50524,50525,50525,50526,50526,50527,50528,
+50528,50529,50530,50530,50531,50531,50532,50533,50533,50534,50534,50535,50536,
+50536,50537,50538,50538,50539,50539,50540,50541,50541,50542,50543,50543,50544,
+50544,50545,50546,50546,50547,50547,50548,50549,50549,50550,50551,50551,50552,
+50552,50553,50554,50554,50555,50556,50556,50557,50557,50558,50559,50559,50560,
+50560,50561,50562,50562,50563,50564,50564,50565,50565,50566,50567,50567,50568,
+50569,50569,50570,50570,50571,50572,50572,50573,50573,50574,50575,50575,50576,
+50577,50577,50578,50578,50579,50580,50580,50581,50582,50582,50583,50583,50584,
+50585,50585,50586,50586,50587,50588,50588,50589,50590,50590,50591,50591,50592,
+50593,50593,50594,50595,50595,50596,50596,50597,50598,50598,50599,50599,50600,
+50601,50601,50602,50603,50603,50604,50604,50605,50606,50606,50607,50607,50608,
+50609,50609,50610,50611,50611,50612,50612,50613,50614,50614,50615,50616,50616,
+50617,50617,50618,50619,50619,50620,50620,50621,50622,50622,50623,50624,50624,
+50625,50625,50626,50627,50627,50628,50628,50629,50630,50630,50631,50632,50632,
+50633,50633,50634,50635,50635,50636,50637,50637,50638,50638,50639,50640,50640,
+50641,50641,50642,50643,50643,50644,50645,50645,50646,50646,50647,50648,50648,
+50649,50649,50650,50651,50651,50652,50653,50653,50654,50654,50655,50656,50656,
+50657,50657,50658,50659,50659,50660,50661,50661,50662,50662,50663,50664,50664,
+50665,50666,50666,50667,50667,50668,50669,50669,50670,50670,50671,50672,50672,
+50673,50674,50674,50675,50675,50676,50677,50677,50678,50678,50679,50680,50680,
+50681,50682,50682,50683,50683,50684,50685,50685,50686,50686,50687,50688,50688,
+50689,50690,50690,50691,50691,50692,50693,50693,50694,50695,50695,50696,50696,
+50697,50698,50698,50699,50699,50700,50701,50701,50702,50703,50703,50704,50704,
+50705,50706,50706,50707,50707,50708,50709,50709,50710,50711,50711,50712,50712,
+50713,50714,50714,50715,50715,50716,50717,50717,50718,50719,50719,50720,50720,
+50721,50722,50722,50723,50723,50724,50725,50725,50726,50727,50727,50728,50728,
+50729,50730,50730,50731,50731,50732,50733,50733,50734,50735,50735,50736,50736,
+50737,50738,50738,50739,50739,50740,50741,50741,50742,50743,50743,50744,50744,
+50745,50746,50746,50747,50747,50748,50749,50749,50750,50751,50751,50752,50752,
+50753,50754,50754,50755,50755,50756,50757,50757,50758,50759,50759,50760,50760,
+50761,50762,50762,50763,50763,50764,50765,50765,50766,50767,50767,50768,50768,
+50769,50770,50770,50771,50771,50772,50773,50773,50774,50775,50775,50776,50776,
+50777,50778,50778,50779,50779,50780,50781,50781,50782,50783,50783,50784,50784,
+50785,50786,50786,50787,50787,50788,50789,50789,50790,50791,50791,50792,50792,
+50793,50794,50794,50795,50795,50796,50797,50797,50798,50799,50799,50800,50800,
+50801,50802,50802,50803,50803,50804,50805,50805,50806,50807,50807,50808,50808,
+50809,50810,50810,50811,50811,50812,50813,50813,50814,50815,50815,50816,50816,
+50817,50818,50818,50819,50819,50820,50821,50821,50822,50823,50823,50824,50824,
+50825,50826,50826,50827,50827,50828,50829,50829,50830,50831,50831,50832,50832,
+50833,50834,50834,50835,50835,50836,50837,50837,50838,50839,50839,50840,50840,
+50841,50842,50842,50843,50843,50844,50845,50845,50846,50846,50847,50848,50848,
+50849,50850,50850,50851,50851,50852,50853,50853,50854,50854,50855,50856,50856,
+50857,50858,50858,50859,50859,50860,50861,50861,50862,50862,50863,50864,50864,
+50865,50866,50866,50867,50867,50868,50869,50869,50870,50870,50871,50872,50872,
+50873,50874,50874,50875,50875,50876,50877,50877,50878,50878,50879,50880,50880,
+50881,50881,50882,50883,50883,50884,50885,50885,50886,50886,50887,50888,50888,
+50889,50889,50890,50891,50891,50892,50893,50893,50894,50894,50895,50896,50896,
+50897,50897,50898,50899,50899,50900,50900,50901,50902,50902,50903,50904,50904,
+50905,50905,50906,50907,50907,50908,50908,50909,50910,50910,50911,50912,50912,
+50913,50913,50914,50915,50915,50916,50916,50917,50918,50918,50919,50920,50920,
+50921,50921,50922,50923,50923,50924,50924,50925,50926,50926,50927,50927,50928,
+50929,50929,50930,50931,50931,50932,50932,50933,50934,50934,50935,50935,50936,
+50937,50937,50938,50939,50939,50940,50940,50941,50942,50942,50943,50943,50944,
+50945,50945,50946,50946,50947,50948,50948,50949,50950,50950,50951,50951,50952,
+50953,50953,50954,50954,50955,50956,50956,50957,50957,50958,50959,50959,50960,
+50961,50961,50962,50962,50963,50964,50964,50965,50965,50966,50967,50967,50968,
+50969,50969,50970,50970,50971,50972,50972,50973,50973,50974,50975,50975,50976,
+50976,50977,50978,50978,50979,50980,50980,50981,50981,50982,50983,50983,50984,
+50984,50985,50986,50986,50987,50987,50988,50989,50989,50990,50991,50991,50992,
+50992,50993,50994,50994,50995,50995,50996,50997,50997,50998,50998,50999,51000,
+51000,51001,51002,51002,51003,51003,51004,51005,51005,51006,51006,51007,51008,
+51008,51009,51010,51010,51011,51011,51012,51013,51013,51014,51014,51015,51016,
+51016,51017,51017,51018,51019,51019,51020,51021,51021,51022,51022,51023,51024,
+51024,51025,51025,51026,51027,51027,51028,51028,51029,51030,51030,51031,51032,
+51032,51033,51033,51034,51035,51035,51036,51036,51037,51038,51038,51039,51039,
+51040,51041,51041,51042,51043,51043,51044,51044,51045,51046,51046,51047,51047,
+51048,51049,51049,51050,51050,51051,51052,51052,51053,51054,51054,51055,51055,
+51056,51057,51057,51058,51058,51059,51060,51060,51061,51061,51062,51063,51063,
+51064,51065,51065,51066,51066,51067,51068,51068,51069,51069,51070,51071,51071,
+51072,51072,51073,51074,51074,51075,51075,51076,51077,51077,51078,51079,51079,
+51080,51080,51081,51082,51082,51083,51083,51084,51085,51085,51086,51086,51087,
+51088,51088,51089,51090,51090,51091,51091,51092,51093,51093,51094,51094,51095,
+51096,51096,51097,51097,51098,51099,51099,51100,51101,51101,51102,51102,51103,
+51104,51104,51105,51105,51106,51107,51107,51108,51108,51109,51110,51110,51111,
+51112,51112,51113,51113,51114,51115,51115,51116,51116,51117,51118,51118,51119,
+51119,51120,51121,51121,51122,51122,51123,51124,51124,51125,51126,51126,51127,
+51127,51128,51129,51129,51130,51130,51131,51132,51132,51133,51133,51134,51135,
+51135,51136,51137,51137,51138,51138,51139,51140,51140,51141,51141,51142,51143,
+51143,51144,51144,51145,51146,51146,51147,51147,51148,51149,51149,51150,51151,
+51151,51152,51152,51153,51154,51154,51155,51155,51156,51157,51157,51158,51158,
+51159,51160,51160,51161,51161,51162,51163,51163,51164,51165,51165,51166,51166,
+51167,51168,51168,51169,51169,51170,51171,51171,51172,51172,51173,51174,51174,
+51175,51175,51176,51177,51177,51178,51179,51179,51180,51180,51181,51182,51182,
+51183,51183,51184,51185,51185,51186,51186,51187,51188,51188,51189,51190,51190,
+51191,51191,51192,51193,51193,51194,51194,51195,51196,51196,51197,51197,51198,
+51199,51199,51200,51200,51201,51202,51202,51203,51203,51204,51205,51205,51206,
+51207,51207,51208,51208,51209,51210,51210,51211,51211,51212,51213,51213,51214,
+51214,51215,51216,51216,51217,51217,51218,51219,51219,51220,51221,51221,51222,
+51222,51223,51224,51224,51225,51225,51226,51227,51227,51228,51228,51229,51230,
+51230,51231,51231,51232,51233,51233,51234,51235,51235,51236,51236,51237,51238,
+51238,51239,51239,51240,51241,51241,51242,51242,51243,51244,51244,51245,51245,
+51246,51247,51247,51248,51249,51249,51250,51250,51251,51252,51252,51253,51253,
+51254,51255,51255,51256,51256,51257,51258,51258,51259,51259,51260,51261,51261,
+51262,51262,51263,51264,51264,51265,51266,51266,51267,51267,51268,51269,51269,
+51270,51270,51271,51272,51272,51273,51273,51274,51275,51275,51276,51276,51277,
+51278,51278,51279,51279,51280,51281,51281,51282,51283,51283,51284,51284,51285,
+51286,51286,51287,51287,51288,51289,51289,51290,51290,51291,51292,51292,51293,
+51293,51294,51295,51295,51296,51296,51297,51298,51298,51299,51300,51300,51301,
+51301,51302,51303,51303,51304,51304,51305,51306,51306,51307,51307,51308,51309,
+51309,51310,51310,51311,51312,51312,51313,51313,51314,51315,51315,51316,51317,
+51317,51318,51318,51319,51320,51320,51321,51321,51322,51323,51323,51324,51324,
+51325,51326,51326,51327,51327,51328,51329,51329,51330,51330,51331,51332,51332,
+51333,51334,51334,51335,51335,51336,51337,51337,51338,51338,51339,51340,51340,
+51341,51341,51342,51343,51343,51344,51344,51345,51346,51346,51347,51347,51348,
+51349,51349,51350,51350,51351,51352,51352,51353,51354,51354,51355,51355,51356,
+51357,51357,51358,51358,51359,51360,51360,51361,51361,51362,51363,51363,51364,
+51364,51365,51366,51366,51367,51367,51368,51369,51369,51370,51370,51371,51372,
+51372,51373,51374,51374,51375,51375,51376,51377,51377,51378,51378,51379,51380,
+51380,51381,51381,51382,51383,51383,51384,51384,51385,51386,51386,51387,51387,
+51388,51389,51389,51390,51390,51391,51392,51392,51393,51394,51394,51395,51395,
+51396,51397,51397,51398,51398,51399,51400,51400,51401,51401,51402,51403,51403,
+51404,51404,51405,51406,51406,51407,51407,51408,51409,51409,51410,51410,51411,
+51412,51412,51413,51413,51414,51415,51415,51416,51417,51417,51418,51418,51419,
+51420,51420,51421,51421,51422,51423,51423,51424,51424,51425,51426,51426,51427,
+51427,51428,51429,51429,51430,51430,51431,51432,51432,51433,51433,51434,51435,
+51435,51436,51436,51437,51438,51438,51439,51440,51440,51441,51441,51442,51443,
+51443,51444,51444,51445,51446,51446,51447,51447,51448,51449,51449,51450,51450,
+51451,51452,51452,51453,51453,51454,51455,51455,51456,51456,51457,51458,51458,
+51459,51459,51460,51461,51461,51462,51462,51463,51464,51464,51465,51466,51466,
+51467,51467,51468,51469,51469,51470,51470,51471,51472,51472,51473,51473,51474,
+51475,51475,51476,51476,51477,51478,51478,51479,51479,51480,51481,51481,51482,
+51482,51483,51484,51484,51485,51485,51486,51487,51487,51488,51488,51489,51490,
+51490,51491,51491,51492,51493,51493,51494,51495,51495,51496,51496,51497,51498,
+51498,51499,51499,51500,51501,51501,51502,51502,51503,51504,51504,51505,51505,
+51506,51507,51507,51508,51508,51509,51510,51510,51511,51511,51512,51513,51513,
+51514,51514,51515,51516,51516,51517,51517,51518,51519,51519,51520,51520,51521,
+51522,51522,51523,51523,51524,51525,51525,51526,51527,51527,51528,51528,51529,
+51530,51530,51531,51531,51532,51533,51533,51534,51534,51535,51536,51536,51537,
+51537,51538,51539,51539,51540,51540,51541,51542,51542,51543,51543,51544,51545,
+51545,51546,51546,51547,51548,51548,51549,51549,51550,51551,51551,51552,51552,
+51553,51554,51554,51555,51555,51556,51557,51557,51558,51558,51559,51560,51560,
+51561,51561,51562,51563,51563,51564,51565,51565,51566,51566,51567,51568,51568,
+51569,51569,51570,51571,51571,51572,51572,51573,51574,51574,51575,51575,51576,
+51577,51577,51578,51578,51579,51580,51580,51581,51581,51582,51583,51583,51584,
+51584,51585,51586,51586,51587,51587,51588,51589,51589,51590,51590,51591,51592,
+51592,51593,51593,51594,51595,51595,51596,51596,51597,51598,51598,51599,51599,
+51600,51601,51601,51602,51602,51603,51604,51604,51605,51605,51606,51607,51607,
+51608,51609,51609,51610,51610,51611,51612,51612,51613,51613,51614,51615,51615,
+51616,51616,51617,51618,51618,51619,51619,51620,51621,51621,51622,51622,51623,
+51624,51624,51625,51625,51626,51627,51627,51628,51628,51629,51630,51630,51631,
+51631,51632,51633,51633,51634,51634,51635,51636,51636,51637,51637,51638,51639,
+51639,51640,51640,51641,51642,51642,51643,51643,51644,51645,51645,51646,51646,
+51647,51648,51648,51649,51649,51650,51651,51651,51652,51652,51653,51654,51654,
+51655,51655,51656,51657,51657,51658,51658,51659,51660,51660,51661,51661,51662,
+51663,51663,51664,51664,51665,51666,51666,51667,51667,51668,51669,51669,51670,
+51670,51671,51672,51672,51673,51673,51674,51675,51675,51676,51677,51677,51678,
+51678,51679,51680,51680,51681,51681,51682,51683,51683,51684,51684,51685,51686,
+51686,51687,51687,51688,51689,51689,51690,51690,51691,51692,51692,51693,51693,
+51694,51695,51695,51696,51696,51697,51698,51698,51699,51699,51700,51701,51701,
+51702,51702,51703,51704,51704,51705,51705,51706,51707,51707,51708,51708,51709,
+51710,51710,51711,51711,51712,51713,51713,51714,51714,51715,51716,51716,51717,
+51717,51718,51719,51719,51720,51720,51721,51722,51722,51723,51723,51724,51725,
+51725,51726,51726,51727,51728,51728,51729,51729,51730,51731,51731,51732,51732,
+51733,51734,51734,51735,51735,51736,51737,51737,51738,51738,51739,51740,51740,
+51741,51741,51742,51743,51743,51744,51744,51745,51746,51746,51747,51747,51748,
+51749,51749,51750,51750,51751,51752,51752,51753,51753,51754,51755,51755,51756,
+51756,51757,51758,51758,51759,51759,51760,51761,51761,51762,51762,51763,51764,
+51764,51765,51765,51766,51767,51767,51768,51768,51769,51770,51770,51771,51771,
+51772,51773,51773,51774,51774,51775,51776,51776,51777,51777,51778,51779,51779,
+51780,51780,51781,51782,51782,51783,51783,51784,51785,51785,51786,51786,51787,
+51788,51788,51789,51789,51790,51791,51791,51792,51792,51793,51794,51794,51795,
+51795,51796,51797,51797,51798,51798,51799,51800,51800,51801,51801,51802,51803,
+51803,51804,51804,51805,51806,51806,51807,51807,51808,51809,51809,51810,51810,
+51811,51812,51812,51813,51813,51814,51815,51815,51816,51816,51817,51818,51818,
+51819,51819,51820,51821,51821,51822,51822,51823,51824,51824,51825,51825,51826,
+51827,51827,51828,51828,51829,51830,51830,51831,51831,51832,51833,51833,51834,
+51834,51835,51836,51836,51837,51837,51838,51839,51839,51840,51840,51841,51842,
+51842,51843,51843,51844,51844,51845,51846,51846,51847,51847,51848,51849,51849,
+51850,51850,51851,51852,51852,51853,51853,51854,51855,51855,51856,51856,51857,
+51858,51858,51859,51859,51860,51861,51861,51862,51862,51863,51864,51864,51865,
+51865,51866,51867,51867,51868,51868,51869,51870,51870,51871,51871,51872,51873,
+51873,51874,51874,51875,51876,51876,51877,51877,51878,51879,51879,51880,51880,
+51881,51882,51882,51883,51883,51884,51885,51885,51886,51886,51887,51888,51888,
+51889,51889,51890,51891,51891,51892,51892,51893,51894,51894,51895,51895,51896,
+51897,51897,51898,51898,51899,51900,51900,51901,51901,51902,51903,51903,51904,
+51904,51905,51906,51906,51907,51907,51908,51909,51909,51910,51910,51911,51911,
+51912,51913,51913,51914,51914,51915,51916,51916,51917,51917,51918,51919,51919,
+51920,51920,51921,51922,51922,51923,51923,51924,51925,51925,51926,51926,51927,
+51928,51928,51929,51929,51930,51931,51931,51932,51932,51933,51934,51934,51935,
+51935,51936,51937,51937,51938,51938,51939,51940,51940,51941,51941,51942,51943,
+51943,51944,51944,51945,51946,51946,51947,51947,51948,51949,51949,51950,51950,
+51951,51952,51952,51953,51953,51954,51955,51955,51956,51956,51957,51957,51958,
+51959,51959,51960,51960,51961,51962,51962,51963,51963,51964,51965,51965,51966,
+51966,51967,51968,51968,51969,51969,51970,51971,51971,51972,51972,51973,51974,
+51974,51975,51975,51976,51977,51977,51978,51978,51979,51980,51980,51981,51981,
+51982,51983,51983,51984,51984,51985,51986,51986,51987,51987,51988,51989,51989,
+51990,51990,51991,51992,51992,51993,51993,51994,51994,51995,51996,51996,51997,
+51997,51998,51999,51999,52000,52000,52001,52002,52002,52003,52003,52004,52005,
+52005,52006,52006,52007,52008,52008,52009,52009,52010,52011,52011,52012,52012,
+52013,52014,52014,52015,52015,52016,52017,52017,52018,52018,52019,52020,52020,
+52021,52021,52022,52023,52023,52024,52024,52025,52025,52026,52027,52027,52028,
+52028,52029,52030,52030,52031,52031,52032,52033,52033,52034,52034,52035,52036,
+52036,52037,52037,52038,52039,52039,52040,52040,52041,52042,52042,52043,52043,
+52044,52045,52045,52046,52046,52047,52048,52048,52049,52049,52050,52051,52051,
+52052,52052,52053,52053,52054,52055,52055,52056,52056,52057,52058,52058,52059,
+52059,52060,52061,52061,52062,52062,52063,52064,52064,52065,52065,52066,52067,
+52067,52068,52068,52069,52070,52070,52071,52071,52072,52073,52073,52074,52074,
+52075,52076,52076,52077,52077,52078,52078,52079,52080,52080,52081,52081,52082,
+52083,52083,52084,52084,52085,52086,52086,52087,52087,52088,52089,52089,52090,
+52090,52091,52092,52092,52093,52093,52094,52095,52095,52096,52096,52097,52098,
+52098,52099,52099,52100,52101,52101,52102,52102,52103,52103,52104,52105,52105,
+52106,52106,52107,52108,52108,52109,52109,52110,52111,52111,52112,52112,52113,
+52114,52114,52115,52115,52116,52117,52117,52118,52118,52119,52120,52120,52121,
+52121,52122,52123,52123,52124,52124,52125,52125,52126,52127,52127,52128,52128,
+52129,52130,52130,52131,52131,52132,52133,52133,52134,52134,52135,52136,52136,
+52137,52137,52138,52139,52139,52140,52140,52141,52142,52142,52143,52143,52144,
+52145,52145,52146,52146,52147,52147,52148,52149,52149,52150,52150,52151,52152,
+52152,52153,52153,52154,52155,52155,52156,52156,52157,52158,52158,52159,52159,
+52160,52161,52161,52162,52162,52163,52164,52164,52165,52165,52166,52166,52167,
+52168,52168,52169,52169,52170,52171,52171,52172,52172,52173,52174,52174,52175,
+52175,52176,52177,52177,52178,52178,52179,52180,52180,52181,52181,52182,52183,
+52183,52184,52184,52185,52185,52186,52187,52187,52188,52188,52189,52190,52190,
+52191,52191,52192,52193,52193,52194,52194,52195,52196,52196,52197,52197,52198,
+52199,52199,52200,52200,52201,52202,52202,52203,52203,52204,52204,52205,52206,
+52206,52207,52207,52208,52209,52209,52210,52210,52211,52212,52212,52213,52213,
+52214,52215,52215,52216,52216,52217,52218,52218,52219,52219,52220,52220,52221,
+52222,52222,52223,52223,52224,52225,52225,52226,52226,52227,52228,52228,52229,
+52229,52230,52231,52231,52232,52232,52233,52234,52234,52235,52235,52236,52236,
+52237,52238,52238,52239,52239,52240,52241,52241,52242,52242,52243,52244,52244,
+52245,52245,52246,52247,52247,52248,52248,52249,52250,52250,52251,52251,52252,
+52252,52253,52254,52254,52255,52255,52256,52257,52257,52258,52258,52259,52260,
+52260,52261,52261,52262,52263,52263,52264,52264,52265,52266,52266,52267,52267,
+52268,52268,52269,52270,52270,52271,52271,52272,52273,52273,52274,52274,52275,
+52276,52276,52277,52277,52278,52279,52279,52280,52280,52281,52282,52282,52283,
+52283,52284,52284,52285,52286,52286,52287,52287,52288,52289,52289,52290,52290,
+52291,52292,52292,52293,52293,52294,52295,52295,52296,52296,52297,52298,52298,
+52299,52299,52300,52300,52301,52302,52302,52303,52303,52304,52305,52305,52306,
+52306,52307,52308,52308,52309,52309,52310,52311,52311,52312,52312,52313,52313,
+52314,52315,52315,52316,52316,52317,52318,52318,52319,52319,52320,52321,52321,
+52322,52322,52323,52324,52324,52325,52325,52326,52327,52327,52328,52328,52329,
+52329,52330,52331,52331,52332,52332,52333,52334,52334,52335,52335,52336,52337,
+52337,52338,52338,52339,52340,52340,52341,52341,52342,52342,52343,52344,52344,
+52345,52345,52346,52347,52347,52348,52348,52349,52350,52350,52351,52351,52352,
+52353,52353,52354,52354,52355,52355,52356,52357,52357,52358,52358,52359,52360,
+52360,52361,52361,52362,52363,52363,52364,52364,52365,52366,52366,52367,52367,
+52368,52368,52369,52370,52370,52371,52371,52372,52373,52373,52374,52374,52375,
+52376,52376,52377,52377,52378,52379,52379,52380,52380,52381,52381,52382,52383,
+52383,52384,52384,52385,52386,52386,52387,52387,52388,52389,52389,52390,52390,
+52391,52392,52392,52393,52393,52394,52394,52395,52396,52396,52397,52397,52398,
+52399,52399,52400,52400,52401,52402,52402,52403,52403,52404,52405,52405,52406,
+52406,52407,52407,52408,52409,52409,52410,52410,52411,52412,52412,52413,52413,
+52414,52415,52415,52416,52416,52417,52417,52418,52419,52419,52420,52420,52421,
+52422,52422,52423,52423,52424,52425,52425,52426,52426,52427,52428,52428,52429,
+52429,52430,52430,52431,52432,52432,52433,52433,52434,52435,52435,52436,52436,
+52437,52438,52438,52439,52439,52440,52440,52441,52442,52442,52443,52443,52444,
+52445,52445,52446,52446,52447,52448,52448,52449,52449,52450,52451,52451,52452,
+52452,52453,52453,52454,52455,52455,52456,52456,52457,52458,52458,52459,52459,
+52460,52461,52461,52462,52462,52463,52463,52464,52465,52465,52466,52466,52467,
+52468,52468,52469,52469,52470,52471,52471,52472,52472,52473,52474,52474,52475,
+52475,52476,52476,52477,52478,52478,52479,52479,52480,52481,52481,52482,52482,
+52483,52484,52484,52485,52485,52486,52486,52487,52488,52488,52489,52489,52490,
+52491,52491,52492,52492,52493,52494,52494,52495,52495,52496,52496,52497,52498,
+52498,52499,52499,52500,52501,52501,52502,52502,52503,52504,52504,52505,52505,
+52506,52507,52507,52508,52508,52509,52509,52510,52511,52511,52512,52512,52513,
+52514,52514,52515,52515,52516,52517,52517,52518,52518,52519,52519,52520,52521,
+52521,52522,52522,52523,52524,52524,52525,52525,52526,52527,52527,52528,52528,
+52529,52529,52530,52531,52531,52532,52532,52533,52534,52534,52535,52535,52536,
+52537,52537,52538,52538,52539,52539,52540,52541,52541,52542,52542,52543,52544,
+52544,52545,52545,52546,52547,52547,52548,52548,52549,52549,52550,52551,52551,
+52552,52552,52553,52554,52554,52555,52555,52556,52557,52557,52558,52558,52559,
+52559,52560,52561,52561,52562,52562,52563,52564,52564,52565,52565,52566,52567,
+52567,52568,52568,52569,52569,52570,52571,52571,52572,52572,52573,52574,52574,
+52575,52575,52576,52577,52577,52578,52578,52579,52579,52580,52581,52581,52582,
+52582,52583,52584,52584,52585,52585,52586,52587,52587,52588,52588,52589,52589,
+52590,52591,52591,52592,52592,52593,52594,52594,52595,52595,52596,52596,52597,
+52598,52598,52599,52599,52600,52601,52601,52602,52602,52603,52604,52604,52605,
+52605,52606,52606,52607,52608,52608,52609,52609,52610,52611,52611,52612,52612,
+52613,52614,52614,52615,52615,52616,52616,52617,52618,52618,52619,52619,52620,
+52621,52621,52622,52622,52623,52624,52624,52625,52625,52626,52626,52627,52628,
+52628,52629,52629,52630,52631,52631,52632,52632,52633,52633,52634,52635,52635,
+52636,52636,52637,52638,52638,52639,52639,52640,52641,52641,52642,52642,52643,
+52643,52644,52645,52645,52646,52646,52647,52648,52648,52649,52649,52650,52651,
+52651,52652,52652,52653,52653,52654,52655,52655,52656,52656,52657,52658,52658,
+52659,52659,52660,52660,52661,52662,52662,52663,52663,52664,52665,52665,52666,
+52666,52667,52668,52668,52669,52669,52670,52670,52671,52672,52672,52673,52673,
+52674,52675,52675,52676,52676,52677,52677,52678,52679,52679,52680,52680,52681,
+52682,52682,52683,52683,52684,52685,52685,52686,52686,52687,52687,52688,52689,
+52689,52690,52690,52691,52692,52692,52693,52693,52694,52694,52695,52696,52696,
+52697,52697,52698,52699,52699,52700,52700,52701,52702,52702,52703,52703,52704,
+52704,52705,52706,52706,52707,52707,52708,52709,52709,52710,52710,52711,52711,
+52712,52713,52713,52714,52714,52715,52716,52716,52717,52717,52718,52719,52719,
+52720,52720,52721,52721,52722,52723,52723,52724,52724,52725,52726,52726,52727,
+52727,52728,52728,52729,52730,52730,52731,52731,52732,52733,52733,52734,52734,
+52735,52735,52736,52737,52737,52738,52738,52739,52740,52740,52741,52741,52742,
+52743,52743,52744,52744,52745,52745,52746,52747,52747,52748,52748,52749,52750,
+52750,52751,52751,52752,52752,52753,52754,52754,52755,52755,52756,52757,52757,
+52758,52758,52759,52759,52760,52761,52761,52762,52762,52763,52764,52764,52765,
+52765,52766,52767,52767,52768,52768,52769,52769,52770,52771,52771,52772,52772,
+52773,52774,52774,52775,52775,52776,52776,52777,52778,52778,52779,52779,52780,
+52781,52781,52782,52782,52783,52783,52784,52785,52785,52786,52786,52787,52788,
+52788,52789,52789,52790,52790,52791,52792,52792,52793,52793,52794,52795,52795,
+52796,52796,52797,52798,52798,52799,52799,52800,52800,52801,52802,52802,52803,
+52803,52804,52805,52805,52806,52806,52807,52807,52808,52809,52809,52810,52810,
+52811,52812,52812,52813,52813,52814,52814,52815,52816,52816,52817,52817,52818,
+52819,52819,52820,52820,52821,52821,52822,52823,52823,52824,52824,52825,52826,
+52826,52827,52827,52828,52828,52829,52830,52830,52831,52831,52832,52833,52833,
+52834,52834,52835,52835,52836,52837,52837,52838,52838,52839,52840,52840,52841,
+52841,52842,52842,52843,52844,52844,52845,52845,52846,52847,52847,52848,52848,
+52849,52849,52850,52851,52851,52852,52852,52853,52854,52854,52855,52855,52856,
+52857,52857,52858,52858,52859,52859,52860,52861,52861,52862,52862,52863,52864,
+52864,52865,52865,52866,52866,52867,52868,52868,52869,52869,52870,52871,52871,
+52872,52872,52873,52873,52874,52875,52875,52876,52876,52877,52878,52878,52879,
+52879,52880,52880,52881,52882,52882,52883,52883,52884,52885,52885,52886,52886,
+52887,52887,52888,52889,52889,52890,52890,52891,52892,52892,52893,52893,52894,
+52894,52895,52896,52896,52897,52897,52898,52899,52899,52900,52900,52901,52901,
+52902,52903,52903,52904,52904,52905,52906,52906,52907,52907,52908,52908,52909,
+52910,52910,52911,52911,52912,52913,52913,52914,52914,52915,52915,52916,52917,
+52917,52918,52918,52919,52919,52920,52921,52921,52922,52922,52923,52924,52924,
+52925,52925,52926,52926,52927,52928,52928,52929,52929,52930,52931,52931,52932,
+52932,52933,52933,52934,52935,52935,52936,52936,52937,52938,52938,52939,52939,
+52940,52940,52941,52942,52942,52943,52943,52944,52945,52945,52946,52946,52947,
+52947,52948,52949,52949,52950,52950,52951,52952,52952,52953,52953,52954,52954,
+52955,52956,52956,52957,52957,52958,52959,52959,52960,52960,52961,52961,52962,
+52963,52963,52964,52964,52965,52966,52966,52967,52967,52968,52968,52969,52970,
+52970,52971,52971,52972,52972,52973,52974,52974,52975,52975,52976,52977,52977,
+52978,52978,52979,52979,52980,52981,52981,52982,52982,52983,52984,52984,52985,
+52985,52986,52986,52987,52988,52988,52989,52989,52990,52991,52991,52992,52992,
+52993,52993,52994,52995,52995,52996,52996,52997,52998,52998,52999,52999,53000,
+53000,53001,53002,53002,53003,53003,53004,53004,53005,53006,53006,53007,53007,
+53008,53009,53009,53010,53010,53011,53011,53012,53013,53013,53014,53014,53015,
+53016,53016,53017,53017,53018,53018,53019,53020,53020,53021,53021,53022,53023,
+53023,53024,53024,53025,53025,53026,53027,53027,53028,53028,53029,53029,53030,
+53031,53031,53032,53032,53033,53034,53034,53035,53035,53036,53036,53037,53038,
+53038,53039,53039,53040,53041,53041,53042,53042,53043,53043,53044,53045,53045,
+53046,53046,53047,53048,53048,53049,53049,53050,53050,53051,53052,53052,53053,
+53053,53054,53054,53055,53056,53056,53057,53057,53058,53059,53059,53060,53060,
+53061,53061,53062,53063,53063,53064,53064,53065,53066,53066,53067,53067,53068,
+53068,53069,53070,53070,53071,53071,53072,53072,53073,53074,53074,53075,53075,
+53076,53077,53077,53078,53078,53079,53079,53080,53081,53081,53082,53082,53083,
+53084,53084,53085,53085,53086,53086,53087,53088,53088,53089,53089,53090,53090,
+53091,53092,53092,53093,53093,53094,53095,53095,53096,53096,53097,53097,53098,
+53099,53099,53100,53100,53101,53102,53102,53103,53103,53104,53104,53105,53106,
+53106,53107,53107,53108,53108,53109,53110,53110,53111,53111,53112,53113,53113,
+53114,53114,53115,53115,53116,53117,53117,53118,53118,53119,53119,53120,53121,
+53121,53122,53122,53123,53124,53124,53125,53125,53126,53126,53127,53128,53128,
+53129,53129,53130,53131,53131,53132,53132,53133,53133,53134,53135,53135,53136,
+53136,53137,53137,53138,53139,53139,53140,53140,53141,53142,53142,53143,53143,
+53144,53144,53145,53146,53146,53147,53147,53148,53148,53149,53150,53150,53151,
+53151,53152,53153,53153,53154,53154,53155,53155,53156,53157,53157,53158,53158,
+53159,53159,53160,53161,53161,53162,53162,53163,53164,53164,53165,53165,53166,
+53166,53167,53168,53168,53169,53169,53170,53170,53171,53172,53172,53173,53173,
+53174,53175,53175,53176,53176,53177,53177,53178,53179,53179,53180,53180,53181,
+53181,53182,53183,53183,53184,53184,53185,53186,53186,53187,53187,53188,53188,
+53189,53190,53190,53191,53191,53192,53192,53193,53194,53194,53195,53195,53196,
+53197,53197,53198,53198,53199,53199,53200,53201,53201,53202,53202,53203,53203,
+53204,53205,53205,53206,53206,53207,53208,53208,53209,53209,53210,53210,53211,
+53212,53212,53213,53213,53214,53214,53215,53216,53216,53217,53217,53218,53219,
+53219,53220,53220,53221,53221,53222,53223,53223,53224,53224,53225,53225,53226,
+53227,53227,53228,53228,53229,53230,53230,53231,53231,53232,53232,53233,53234,
+53234,53235,53235,53236,53236,53237,53238,53238,53239,53239,53240,53241,53241,
+53242,53242,53243,53243,53244,53245,53245,53246,53246,53247,53247,53248,53249,
+53249,53250,53250,53251,53251,53252,53253,53253,53254,53254,53255,53256,53256,
+53257,53257,53258,53258,53259,53260,53260,53261,53261,53262,53262,53263,53264,
+53264,53265,53265,53266,53267,53267,53268,53268,53269,53269,53270,53271,53271,
+53272,53272,53273,53273,53274,53275,53275,53276,53276,53277,53278,53278,53279,
+53279,53280,53280,53281,53282,53282,53283,53283,53284,53284,53285,53286,53286,
+53287,53287,53288,53288,53289,53290,53290,53291,53291,53292,53293,53293,53294,
+53294,53295,53295,53296,53297,53297,53298,53298,53299,53299,53300,53301,53301,
+53302,53302,53303,53303,53304,53305,53305,53306,53306,53307,53308,53308,53309,
+53309,53310,53310,53311,53312,53312,53313,53313,53314,53314,53315,53316,53316,
+53317,53317,53318,53318,53319,53320,53320,53321,53321,53322,53323,53323,53324,
+53324,53325,53325,53326,53327,53327,53328,53328,53329,53329,53330,53331,53331,
+53332,53332,53333,53333,53334,53335,53335,53336,53336,53337,53338,53338,53339,
+53339,53340,53340,53341,53342,53342,53343,53343,53344,53344,53345,53346,53346,
+53347,53347,53348,53348,53349,53350,53350,53351,53351,53352,53353,53353,53354,
+53354,53355,53355,53356,53357,53357,53358,53358,53359,53359,53360,53361,53361,
+53362,53362,53363,53363,53364,53365,53365,53366,53366,53367,53368,53368,53369,
+53369,53370,53370,53371,53372,53372,53373,53373,53374,53374,53375,53376,53376,
+53377,53377,53378,53378,53379,53380,53380,53381,53381,53382,53383,53383,53384,
+53384,53385,53385,53386,53387,53387,53388,53388,53389,53389,53390,53391,53391,
+53392,53392,53393,53393,53394,53395,53395,53396,53396,53397,53397,53398,53399,
+53399,53400,53400,53401,53402,53402,53403,53403,53404,53404,53405,53406,53406,
+53407,53407,53408,53408,53409,53410,53410,53411,53411,53412,53412,53413,53414,
+53414,53415,53415,53416,53416,53417,53418,53418,53419,53419,53420,53421,53421,
+53422,53422,53423,53423,53424,53425,53425,53426,53426,53427,53427,53428,53429,
+53429,53430,53430,53431,53431,53432,53433,53433,53434,53434,53435,53435,53436,
+53437,53437,53438,53438,53439,53440,53440,53441,53441,53442,53442,53443,53444,
+53444,53445,53445,53446,53446,53447,53448,53448,53449,53449,53450,53450,53451,
+53452,53452,53453,53453,53454,53454,53455,53456,53456,53457,53457,53458,53458,
+53459,53460,53460,53461,53461,53462,53463,53463,53464,53464,53465,53465,53466,
+53467,53467,53468,53468,53469,53469,53470,53471,53471,53472,53472,53473,53473,
+53474,53475,53475,53476,53476,53477,53477,53478,53479,53479,53480,53480,53481,
+53481,53482,53483,53483,53484,53484,53485,53486,53486,53487,53487,53488,53488,
+53489,53490,53490,53491,53491,53492,53492,53493,53494,53494,53495,53495,53496,
+53496,53497,53498,53498,53499,53499,53500,53500,53501,53502,53502,53503,53503,
+53504,53504,53505,53506,53506,53507,53507,53508,53508,53509,53510,53510,53511,
+53511,53512,53513,53513,53514,53514,53515,53515,53516,53517,53517,53518,53518,
+53519,53519,53520,53521,53521,53522,53522,53523,53523,53524,53525,53525,53526,
+53526,53527,53527,53528,53529,53529,53530,53530,53531,53531,53532,53533,53533,
+53534,53534,53535,53535,53536,53537,53537,53538,53538,53539,53540,53540,53541,
+53541,53542,53542,53543,53544,53544,53545,53545,53546,53546,53547,53548,53548,
+53549,53549,53550,53550,53551,53552,53552,53553,53553,53554,53554,53555,53556,
+53556,53557,53557,53558,53558,53559,53560,53560,53561,53561,53562,53562,53563,
+53564,53564,53565,53565,53566,53566,53567,53568,53568,53569,53569,53570,53570,
+53571,53572,53572,53573,53573,53574,53574,53575,53576,53576,53577,53577,53578,
+53579,53579,53580,53580,53581,53581,53582,53583,53583,53584,53584,53585,53585,
+53586,53587,53587,53588,53588,53589,53589,53590,53591,53591,53592,53592,53593,
+53593,53594,53595,53595,53596,53596,53597,53597,53598,53599,53599,53600,53600,
+53601,53601,53602,53603,53603,53604,53604,53605,53605,53606,53607,53607,53608,
+53608,53609,53609,53610,53611,53611,53612,53612,53613,53613,53614,53615,53615,
+53616,53616,53617,53617,53618,53619,53619,53620,53620,53621,53621,53622,53623,
+53623,53624,53624,53625,53626,53626,53627,53627,53628,53628,53629,53630,53630,
+53631,53631,53632,53632,53633,53634,53634,53635,53635,53636,53636,53637,53638,
+53638,53639,53639,53640,53640,53641,53642,53642,53643,53643,53644,53644,53645,
+53646,53646,53647,53647,53648,53648,53649,53650,53650,53651,53651,53652,53652,
+53653,53654,53654,53655,53655,53656,53656,53657,53658,53658,53659,53659,53660,
+53660,53661,53662,53662,53663,53663,53664,53664,53665,53666,53666,53667,53667,
+53668,53668,53669,53670,53670,53671,53671,53672,53672,53673,53674,53674,53675,
+53675,53676,53676,53677,53678,53678,53679,53679,53680,53680,53681,53682,53682,
+53683,53683,53684,53684,53685,53686,53686,53687,53687,53688,53688,53689,53690,
+53690,53691,53691,53692,53692,53693,53694,53694,53695,53695,53696,53696,53697,
+53698,53698,53699,53699,53700,53700,53701,53702,53702,53703,53703,53704,53704,
+53705,53706,53706,53707,53707,53708,53708,53709,53710,53710,53711,53711,53712,
+53712,53713,53714,53714,53715,53715,53716,53716,53717,53718,53718,53719,53719,
+53720,53720,53721,53722,53722,53723,53723,53724,53724,53725,53726,53726,53727,
+53727,53728,53728,53729,53730,53730,53731,53731,53732,53732,53733,53734,53734,
+53735,53735,53736,53736,53737,53738,53738,53739,53739,53740,53740,53741,53742,
+53742,53743,53743,53744,53744,53745,53746,53746,53747,53747,53748,53748,53749,
+53750,53750,53751,53751,53752,53752,53753,53754,53754,53755,53755,53756,53756,
+53757,53758,53758,53759,53759,53760,53760,53761,53762,53762,53763,53763,53764,
+53764,53765,53766,53766,53767,53767,53768,53768,53769,53770,53770,53771,53771,
+53772,53772,53773,53774,53774,53775,53775,53776,53776,53777,53778,53778,53779,
+53779,53780,53780,53781,53782,53782,53783,53783,53784,53784,53785,53786,53786,
+53787,53787,53788,53788,53789,53790,53790,53791,53791,53792,53792,53793,53794,
+53794,53795,53795,53796,53796,53797,53798,53798,53799,53799,53800,53800,53801,
+53802,53802,53803,53803,53804,53804,53805,53806,53806,53807,53807,53808,53808,
+53809,53810,53810,53811,53811,53812,53812,53813,53814,53814,53815,53815,53816,
+53816,53817,53818,53818,53819,53819,53820,53820,53821,53821,53822,53823,53823,
+53824,53824,53825,53825,53826,53827,53827,53828,53828,53829,53829,53830,53831,
+53831,53832,53832,53833,53833,53834,53835,53835,53836,53836,53837,53837,53838,
+53839,53839,53840,53840,53841,53841,53842,53843,53843,53844,53844,53845,53845,
+53846,53847,53847,53848,53848,53849,53849,53850,53851,53851,53852,53852,53853,
+53853,53854,53855,53855,53856,53856,53857,53857,53858,53859,53859,53860,53860,
+53861,53861,53862,53863,53863,53864,53864,53865,53865,53866,53867,53867,53868,
+53868,53869,53869,53870,53870,53871,53872,53872,53873,53873,53874,53874,53875,
+53876,53876,53877,53877,53878,53878,53879,53880,53880,53881,53881,53882,53882,
+53883,53884,53884,53885,53885,53886,53886,53887,53888,53888,53889,53889,53890,
+53890,53891,53892,53892,53893,53893,53894,53894,53895,53896,53896,53897,53897,
+53898,53898,53899,53900,53900,53901,53901,53902,53902,53903,53904,53904,53905,
+53905,53906,53906,53907,53907,53908,53909,53909,53910,53910,53911,53911,53912,
+53913,53913,53914,53914,53915,53915,53916,53917,53917,53918,53918,53919,53919,
+53920,53921,53921,53922,53922,53923,53923,53924,53925,53925,53926,53926,53927,
+53927,53928,53929,53929,53930,53930,53931,53931,53932,53933,53933,53934,53934,
+53935,53935,53936,53936,53937,53938,53938,53939,53939,53940,53940,53941,53942,
+53942,53943,53943,53944,53944,53945,53946,53946,53947,53947,53948,53948,53949,
+53950,53950,53951,53951,53952,53952,53953,53954,53954,53955,53955,53956,53956,
+53957,53958,53958,53959,53959,53960,53960,53961,53961,53962,53963,53963,53964,
+53964,53965,53965,53966,53967,53967,53968,53968,53969,53969,53970,53971,53971,
+53972,53972,53973,53973,53974,53975,53975,53976,53976,53977,53977,53978,53979,
+53979,53980,53980,53981,53981,53982,53983,53983,53984,53984,53985,53985,53986,
+53986,53987,53988,53988,53989,53989,53990,53990,53991,53992,53992,53993,53993,
+53994,53994,53995,53996,53996,53997,53997,53998,53998,53999,54000,54000,54001,
+54001,54002,54002,54003,54004,54004,54005,54005,54006,54006,54007,54007,54008,
+54009,54009,54010,54010,54011,54011,54012,54013,54013,54014,54014,54015,54015,
+54016,54017,54017,54018,54018,54019,54019,54020,54021,54021,54022,54022,54023,
+54023,54024,54024,54025,54026,54026,54027,54027,54028,54028,54029,54030,54030,
+54031,54031,54032,54032,54033,54034,54034,54035,54035,54036,54036,54037,54038,
+54038,54039,54039,54040,54040,54041,54042,54042,54043,54043,54044,54044,54045,
+54045,54046,54047,54047,54048,54048,54049,54049,54050,54051,54051,54052,54052,
+54053,54053,54054,54055,54055,54056,54056,54057,54057,54058,54059,54059,54060,
+54060,54061,54061,54062,54062,54063,54064,54064,54065,54065,54066,54066,54067,
+54068,54068,54069,54069,54070,54070,54071,54072,54072,54073,54073,54074,54074,
+54075,54076,54076,54077,54077,54078,54078,54079,54079,54080,54081,54081,54082,
+54082,54083,54083,54084,54085,54085,54086,54086,54087,54087,54088,54089,54089,
+54090,54090,54091,54091,54092,54093,54093,54094,54094,54095,54095,54096,54096,
+54097,54098,54098,54099,54099,54100,54100,54101,54102,54102,54103,54103,54104,
+54104,54105,54106,54106,54107,54107,54108,54108,54109,54109,54110,54111,54111,
+54112,54112,54113,54113,54114,54115,54115,54116,54116,54117,54117,54118,54119,
+54119,54120,54120,54121,54121,54122,54123,54123,54124,54124,54125,54125,54126,
+54126,54127,54128,54128,54129,54129,54130,54130,54131,54132,54132,54133,54133,
+54134,54134,54135,54136,54136,54137,54137,54138,54138,54139,54139,54140,54141,
+54141,54142,54142,54143,54143,54144,54145,54145,54146,54146,54147,54147,54148,
+54149,54149,54150,54150,54151,54151,54152,54152,54153,54154,54154,54155,54155,
+54156,54156,54157,54158,54158,54159,54159,54160,54160,54161,54162,54162,54163,
+54163,54164,54164,54165,54165,54166,54167,54167,54168,54168,54169,54169,54170,
+54171,54171,54172,54172,54173,54173,54174,54175,54175,54176,54176,54177,54177,
+54178,54178,54179,54180,54180,54181,54181,54182,54182,54183,54184,54184,54185,
+54185,54186,54186,54187,54188,54188,54189,54189,54190,54190,54191,54191,54192,
+54193,54193,54194,54194,54195,54195,54196,54197,54197,54198,54198,54199,54199,
+54200,54201,54201,54202,54202,54203,54203,54204,54204,54205,54206,54206,54207,
+54207,54208,54208,54209,54210,54210,54211,54211,54212,54212,54213,54214,54214,
+54215,54215,54216,54216,54217,54217,54218,54219,54219,54220,54220,54221,54221,
+54222,54223,54223,54224,54224,54225,54225,54226,54227,54227,54228,54228,54229,
+54229,54230,54230,54231,54232,54232,54233,54233,54234,54234,54235,54236,54236,
+54237,54237,54238,54238,54239,54239,54240,54241,54241,54242,54242,54243,54243,
+54244,54245,54245,54246,54246,54247,54247,54248,54249,54249,54250,54250,54251,
+54251,54252,54252,54253,54254,54254,54255,54255,54256,54256,54257,54258,54258,
+54259,54259,54260,54260,54261,54261,54262,54263,54263,54264,54264,54265,54265,
+54266,54267,54267,54268,54268,54269,54269,54270,54271,54271,54272,54272,54273,
+54273,54274,54274,54275,54276,54276,54277,54277,54278,54278,54279,54280,54280,
+54281,54281,54282,54282,54283,54283,54284,54285,54285,54286,54286,54287,54287,
+54288,54289,54289,54290,54290,54291,54291,54292,54292,54293,54294,54294,54295,
+54295,54296,54296,54297,54298,54298,54299,54299,54300,54300,54301,54302,54302,
+54303,54303,54304,54304,54305,54305,54306,54307,54307,54308,54308,54309,54309,
+54310,54311,54311,54312,54312,54313,54313,54314,54314,54315,54316,54316,54317,
+54317,54318,54318,54319,54320,54320,54321,54321,54322,54322,54323,54323,54324,
+54325,54325,54326,54326,54327,54327,54328,54329,54329,54330,54330,54331,54331,
+54332,54332,54333,54334,54334,54335,54335,54336,54336,54337,54338,54338,54339,
+54339,54340,54340,54341,54341,54342,54343,54343,54344,54344,54345,54345,54346,
+54347,54347,54348,54348,54349,54349,54350,54350,54351,54352,54352,54353,54353,
+54354,54354,54355,54356,54356,54357,54357,54358,54358,54359,54360,54360,54361,
+54361,54362,54362,54363,54363,54364,54365,54365,54366,54366,54367,54367,54368,
+54369,54369,54370,54370,54371,54371,54372,54372,54373,54374,54374,54375,54375,
+54376,54376,54377,54378,54378,54379,54379,54380,54380,54381,54381,54382,54383,
+54383,54384,54384,54385,54385,54386,54386,54387,54388,54388,54389,54389,54390,
+54390,54391,54392,54392,54393,54393,54394,54394,54395,54395,54396,54397,54397,
+54398,54398,54399,54399,54400,54401,54401,54402,54402,54403,54403,54404,54404,
+54405,54406,54406,54407,54407,54408,54408,54409,54410,54410,54411,54411,54412,
+54412,54413,54413,54414,54415,54415,54416,54416,54417,54417,54418,54419,54419,
+54420,54420,54421,54421,54422,54422,54423,54424,54424,54425,54425,54426,54426,
+54427,54428,54428,54429,54429,54430,54430,54431,54431,54432,54433,54433,54434,
+54434,54435,54435,54436,54437,54437,54438,54438,54439,54439,54440,54440,54441,
+54442,54442,54443,54443,54444,54444,54445,54445,54446,54447,54447,54448,54448,
+54449,54449,54450,54451,54451,54452,54452,54453,54453,54454,54454,54455,54456,
+54456,54457,54457,54458,54458,54459,54460,54460,54461,54461,54462,54462,54463,
+54463,54464,54465,54465,54466,54466,54467,54467,54468,54469,54469,54470,54470,
+54471,54471,54472,54472,54473,54474,54474,54475,54475,54476,54476,54477,54477,
+54478,54479,54479,54480,54480,54481,54481,54482,54483,54483,54484,54484,54485,
+54485,54486,54486,54487,54488,54488,54489,54489,54490,54490,54491,54492,54492,
+54493,54493,54494,54494,54495,54495,54496,54497,54497,54498,54498,54499,54499,
+54500,54500,54501,54502,54502,54503,54503,54504,54504,54505,54506,54506,54507,
+54507,54508,54508,54509,54509,54510,54511,54511,54512,54512,54513,54513,54514,
+54514,54515,54516,54516,54517,54517,54518,54518,54519,54520,54520,54521,54521,
+54522,54522,54523,54523,54524,54525,54525,54526,54526,54527,54527,54528,54529,
+54529,54530,54530,54531,54531,54532,54532,54533,54534,54534,54535,54535,54536,
+54536,54537,54537,54538,54539,54539,54540,54540,54541,54541,54542,54543,54543,
+54544,54544,54545,54545,54546,54546,54547,54548,54548,54549,54549,54550,54550,
+54551,54551,54552,54553,54553,54554,54554,54555,54555,54556,54557,54557,54558,
+54558,54559,54559,54560,54560,54561,54562,54562,54563,54563,54564,54564,54565,
+54565,54566,54567,54567,54568,54568,54569,54569,54570,54571,54571,54572,54572,
+54573,54573,54574,54574,54575,54576,54576,54577,54577,54578,54578,54579,54579,
+54580,54581,54581,54582,54582,54583,54583,54584,54585,54585,54586,54586,54587,
+54587,54588,54588,54589,54590,54590,54591,54591,54592,54592,54593,54593,54594,
+54595,54595,54596,54596,54597,54597,54598,54598,54599,54600,54600,54601,54601,
+54602,54602,54603,54604,54604,54605,54605,54606,54606,54607,54607,54608,54609,
+54609,54610,54610,54611,54611,54612,54612,54613,54614,54614,54615,54615,54616,
+54616,54617,54618,54618,54619,54619,54620,54620,54621,54621,54622,54623,54623,
+54624,54624,54625,54625,54626,54626,54627,54628,54628,54629,54629,54630,54630,
+54631,54631,54632,54633,54633,54634,54634,54635,54635,54636,54637,54637,54638,
+54638,54639,54639,54640,54640,54641,54642,54642,54643,54643,54644,54644,54645,
+54645,54646,54647,54647,54648,54648,54649,54649,54650,54650,54651,54652,54652,
+54653,54653,54654,54654,54655,54656,54656,54657,54657,54658,54658,54659,54659,
+54660,54661,54661,54662,54662,54663,54663,54664,54664,54665,54666,54666,54667,
+54667,54668,54668,54669,54669,54670,54671,54671,54672,54672,54673,54673,54674,
+54675,54675,54676,54676,54677,54677,54678,54678,54679,54680,54680,54681,54681,
+54682,54682,54683,54683,54684,54685,54685,54686,54686,54687,54687,54688,54688,
+54689,54690,54690,54691,54691,54692,54692,54693,54693,54694,54695,54695,54696,
+54696,54697,54697,54698,54699,54699,54700,54700,54701,54701,54702,54702,54703,
+54704,54704,54705,54705,54706,54706,54707,54707,54708,54709,54709,54710,54710,
+54711,54711,54712,54712,54713,54714,54714,54715,54715,54716,54716,54717,54717,
+54718,54719,54719,54720,54720,54721,54721,54722,54723,54723,54724,54724,54725,
+54725,54726,54726,54727,54728,54728,54729,54729,54730,54730,54731,54731,54732,
+54733,54733,54734,54734,54735,54735,54736,54736,54737,54738,54738,54739,54739,
+54740,54740,54741,54741,54742,54743,54743,54744,54744,54745,54745,54746,54746,
+54747,54748,54748,54749,54749,54750,54750,54751,54751,54752,54753,54753,54754,
+54754,54755,54755,54756,54757,54757,54758,54758,54759,54759,54760,54760,54761,
+54762,54762,54763,54763,54764,54764,54765,54765,54766,54767,54767,54768,54768,
+54769,54769,54770,54770,54771,54772,54772,54773,54773,54774,54774,54775,54775,
+54776,54777,54777,54778,54778,54779,54779,54780,54780,54781,54782,54782,54783,
+54783,54784,54784,54785,54785,54786,54787,54787,54788,54788,54789,54789,54790,
+54790,54791,54792,54792,54793,54793,54794,54794,54795,54796,54796,54797,54797,
+54798,54798,54799,54799,54800,54801,54801,54802,54802,54803,54803,54804,54804,
+54805,54806,54806,54807,54807,54808,54808,54809,54809,54810,54811,54811,54812,
+54812,54813,54813,54814,54814,54815,54816,54816,54817,54817,54818,54818,54819,
+54819,54820,54821,54821,54822,54822,54823,54823,54824,54824,54825,54826,54826,
+54827,54827,54828,54828,54829,54829,54830,54831,54831,54832,54832,54833,54833,
+54834,54834,54835,54836,54836,54837,54837,54838,54838,54839,54839,54840,54841,
+54841,54842,54842,54843,54843,54844,54844,54845,54846,54846,54847,54847,54848,
+54848,54849,54849,54850,54851,54851,54852,54852,54853,54853,54854,54854,54855,
+54856,54856,54857,54857,54858,54858,54859,54859,54860,54861,54861,54862,54862,
+54863,54863,54864,54864,54865,54866,54866,54867,54867,54868,54868,54869,54869,
+54870,54871,54871,54872,54872,54873,54873,54874,54874,54875,54876,54876,54877,
+54877,54878,54878,54879,54879,54880,54881,54881,54882,54882,54883,54883,54884,
+54884,54885,54886,54886,54887,54887,54888,54888,54889,54889,54890,54891,54891,
+54892,54892,54893,54893,54894,54894,54895,54896,54896,54897,54897,54898,54898,
+54899,54899,54900,54901,54901,54902,54902,54903,54903,54904,54904,54905,54906,
+54906,54907,54907,54908,54908,54909,54909,54910,54911,54911,54912,54912,54913,
+54913,54914,54914,54915,54916,54916,54917,54917,54918,54918,54919,54919,54920,
+54921,54921,54922,54922,54923,54923,54924,54924,54925,54926,54926,54927,54927,
+54928,54928,54929,54929,54930,54931,54931,54932,54932,54933,54933,54934,54934,
+54935,54936,54936,54937,54937,54938,54938,54939,54939,54940,54941,54941,54942,
+54942,54943,54943,54944,54944,54945,54946,54946,54947,54947,54948,54948,54949,
+54949,54950,54951,54951,54952,54952,54953,54953,54954,54954,54955,54956,54956,
+54957,54957,54958,54958,54959,54959,54960,54961,54961,54962,54962,54963,54963,
+54964,54964,54965,54966,54966,54967,54967,54968,54968,54969,54969,54970,54971,
+54971,54972,54972,54973,54973,54974,54974,54975,54976,54976,54977,54977,54978,
+54978,54979,54979,54980,54980,54981,54982,54982,54983,54983,54984,54984,54985,
+54985,54986,54987,54987,54988,54988,54989,54989,54990,54990,54991,54992,54992,
+54993,54993,54994,54994,54995,54995,54996,54997,54997,54998,54998,54999,54999,
+55000,55000,55001,55002,55002,55003,55003,55004,55004,55005,55005,55006,55007,
+55007,55008,55008,55009,55009,55010,55010,55011,55012,55012,55013,55013,55014,
+55014,55015,55015,55016,55017,55017,55018,55018,55019,55019,55020,55020,55021,
+55021,55022,55023,55023,55024,55024,55025,55025,55026,55026,55027,55028,55028,
+55029,55029,55030,55030,55031,55031,55032,55033,55033,55034,55034,55035,55035,
+55036,55036,55037,55038,55038,55039,55039,55040,55040,55041,55041,55042,55043,
+55043,55044,55044,55045,55045,55046,55046,55047,55048,55048,55049,55049,55050,
+55050,55051,55051,55052,55052,55053,55054,55054,55055,55055,55056,55056,55057,
+55057,55058,55059,55059,55060,55060,55061,55061,55062,55062,55063,55064,55064,
+55065,55065,55066,55066,55067,55067,55068,55069,55069,55070,55070,55071,55071,
+55072,55072,55073,55074,55074,55075,55075,55076,55076,55077,55077,55078,55078,
+55079,55080,55080,55081,55081,55082,55082,55083,55083,55084,55085,55085,55086,
+55086,55087,55087,55088,55088,55089,55090,55090,55091,55091,55092,55092,55093,
+55093,55094,55095,55095,55096,55096,55097,55097,55098,55098,55099,55100,55100,
+55101,55101,55102,55102,55103,55103,55104,55104,55105,55106,55106,55107,55107,
+55108,55108,55109,55109,55110,55111,55111,55112,55112,55113,55113,55114,55114,
+55115,55116,55116,55117,55117,55118,55118,55119,55119,55120,55121,55121,55122,
+55122,55123,55123,55124,55124,55125,55125,55126,55127,55127,55128,55128,55129,
+55129,55130,55130,55131,55132,55132,55133,55133,55134,55134,55135,55135,55136,
+55137,55137,55138,55138,55139,55139,55140,55140,55141,55141,55142,55143,55143,
+55144,55144,55145,55145,55146,55146,55147,55148,55148,55149,55149,55150,55150,
+55151,55151,55152,55153,55153,55154,55154,55155,55155,55156,55156,55157,55158,
+55158,55159,55159,55160,55160,55161,55161,55162,55162,55163,55164,55164,55165,
+55165,55166,55166,55167,55167,55168,55169,55169,55170,55170,55171,55171,55172,
+55172,55173,55174,55174,55175,55175,55176,55176,55177,55177,55178,55178,55179,
+55180,55180,55181,55181,55182,55182,55183,55183,55184,55185,55185,55186,55186,
+55187,55187,55188,55188,55189,55190,55190,55191,55191,55192,55192,55193,55193,
+55194,55194,55195,55196,55196,55197,55197,55198,55198,55199,55199,55200,55201,
+55201,55202,55202,55203,55203,55204,55204,55205,55205,55206,55207,55207,55208,
+55208,55209,55209,55210,55210,55211,55212,55212,55213,55213,55214,55214,55215,
+55215,55216,55217,55217,55218,55218,55219,55219,55220,55220,55221,55221,55222,
+55223,55223,55224,55224,55225,55225,55226,55226,55227,55228,55228,55229,55229,
+55230,55230,55231,55231,55232,55233,55233,55234,55234,55235,55235,55236,55236,
+55237,55237,55238,55239,55239,55240,55240,55241,55241,55242,55242,55243,55244,
+55244,55245,55245,55246,55246,55247,55247,55248,55248,55249,55250,55250,55251,
+55251,55252,55252,55253,55253,55254,55255,55255,55256,55256,55257,55257,55258,
+55258,55259,55259,55260,55261,55261,55262,55262,55263,55263,55264,55264,55265,
+55266,55266,55267,55267,55268,55268,55269,55269,55270,55271,55271,55272,55272,
+55273,55273,55274,55274,55275,55275,55276,55277,55277,55278,55278,55279,55279,
+55280,55280,55281,55282,55282,55283,55283,55284,55284,55285,55285,55286,55286,
+55287,55288,55288,55289,55289,55290,55290,55291,55291,55292,55293,55293,55294,
+55294,55295,55295,55296,55296,55297,55297,55298,55299,55299,55300,55300,55301,
+55301,55302,55302,55303,55304,55304,55305,55305,55306,55306,55307,55307,55308,
+55308,55309,55310,55310,55311,55311,55312,55312,55313,55313,55314,55315,55315,
+55316,55316,55317,55317,55318,55318,55319,55319,55320,55321,55321,55322,55322,
+55323,55323,55324,55324,55325,55326,55326,55327,55327,55328,55328,55329,55329,
+55330,55330,55331,55332,55332,55333,55333,55334,55334,55335,55335,55336,55337,
+55337,55338,55338,55339,55339,55340,55340,55341,55341,55342,55343,55343,55344,
+55344,55345,55345,55346,55346,55347,55348,55348,55349,55349,55350,55350,55351,
+55351,55352,55352,55353,55354,55354,55355,55355,55356,55356,55357,55357,55358,
+55358,55359,55360,55360,55361,55361,55362,55362,55363,55363,55364,55365,55365,
+55366,55366,55367,55367,55368,55368,55369,55369,55370,55371,55371,55372,55372,
+55373,55373,55374,55374,55375,55376,55376,55377,55377,55378,55378,55379,55379,
+55380,55380,55381,55382,55382,55383,55383,55384,55384,55385,55385,55386,55387,
+55387,55388,55388,55389,55389,55390,55390,55391,55391,55392,55393,55393,55394,
+55394,55395,55395,55396,55396,55397,55397,55398,55399,55399,55400,55400,55401,
+55401,55402,55402,55403,55404,55404,55405,55405,55406,55406,55407,55407,55408,
+55408,55409,55410,55410,55411,55411,55412,55412,55413,55413,55414,55414,55415,
+55416,55416,55417,55417,55418,55418,55419,55419,55420,55421,55421,55422,55422,
+55423,55423,55424,55424,55425,55425,55426,55427,55427,55428,55428,55429,55429,
+55430,55430,55431,55431,55432,55433,55433,55434,55434,55435,55435,55436,55436,
+55437,55438,55438,55439,55439,55440,55440,55441,55441,55442,55442,55443,55444,
+55444,55445,55445,55446,55446,55447,55447,55448,55448,55449,55450,55450,55451,
+55451,55452,55452,55453,55453,55454,55455,55455,55456,55456,55457,55457,55458,
+55458,55459,55459,55460,55461,55461,55462,55462,55463,55463,55464,55464,55465,
+55465,55466,55467,55467,55468,55468,55469,55469,55470,55470,55471,55472,55472,
+55473,55473,55474,55474,55475,55475,55476,55476,55477,55478,55478,55479,55479,
+55480,55480,55481,55481,55482,55482,55483,55484,55484,55485,55485,55486,55486,
+55487,55487,55488,55488,55489,55490,55490,55491,55491,55492,55492,55493,55493,
+55494,55495,55495,55496,55496,55497,55497,55498,55498,55499,55499,55500,55501,
+55501,55502,55502,55503,55503,55504,55504,55505,55505,55506,55507,55507,55508,
+55508,55509,55509,55510,55510,55511,55511,55512,55513,55513,55514,55514,55515,
+55515,55516,55516,55517,55518,55518,55519,55519,55520,55520,55521,55521,55522,
+55522,55523,55524,55524,55525,55525,55526,55526,55527,55527,55528,55528,55529,
+55530,55530,55531,55531,55532,55532,55533,55533,55534,55534,55535,55536,55536,
+55537,55537,55538,55538,55539,55539,55540,55540,55541,55542,55542,55543,55543,
+55544,55544,55545,55545,55546,55546,55547,55548,55548,55549,55549,55550,55550,
+55551,55551,55552,55553,55553,55554,55554,55555,55555,55556,55556,55557,55557,
+55558,55559,55559,55560,55560,55561,55561,55562,55562,55563,55563,55564,55565,
+55565,55566,55566,55567,55567,55568,55568,55569,55569,55570,55571,55571,55572,
+55572,55573,55573,55574,55574,55575,55575,55576,55577,55577,55578,55578,55579,
+55579,55580,55580,55581,55581,55582,55583,55583,55584,55584,55585,55585,55586,
+55586,55587,55587,55588,55589,55589,55590,55590,55591,55591,55592,55592,55593,
+55594,55594,55595,55595,55596,55596,55597,55597,55598,55598,55599,55600,55600,
+55601,55601,55602,55602,55603,55603,55604,55604,55605,55606,55606,55607,55607,
+55608,55608,55609,55609,55610,55610,55611,55612,55612,55613,55613,55614,55614,
+55615,55615,55616,55616,55617,55618,55618,55619,55619,55620,55620,55621,55621,
+55622,55622,55623,55624,55624,55625,55625,55626,55626,55627,55627,55628,55628,
+55629,55630,55630,55631,55631,55632,55632,55633,55633,55634,55634,55635,55636,
+55636,55637,55637,55638,55638,55639,55639,55640,55640,55641,55642,55642,55643,
+55643,55644,55644,55645,55645,55646,55646,55647,55648,55648,55649,55649,55650,
+55650,55651,55651,55652,55652,55653,55654,55654,55655,55655,55656,55656,55657,
+55657,55658,55658,55659,55660,55660,55661,55661,55662,55662,55663,55663,55664,
+55664,55665,55666,55666,55667,55667,55668,55668,55669,55669,55670,55670,55671,
+55672,55672,55673,55673,55674,55674,55675,55675,55676,55676,55677,55678,55678,
+55679,55679,55680,55680,55681,55681,55682,55682,55683,55684,55684,55685,55685,
+55686,55686,55687,55687,55688,55688,55689,55690,55690,55691,55691,55692,55692,
+55693,55693,55694,55694,55695,55696,55696,55697,55697,55698,55698,55699,55699,
+55700,55700,55701,55702,55702,55703,55703,55704,55704,55705,55705,55706,55706,
+55707,55708,55708,55709,55709,55710,55710,55711,55711,55712,55712,55713,55714,
+55714,55715,55715,55716,55716,55717,55717,55718,55718,55719,55720,55720,55721,
+55721,55722,55722,55723,55723,55724,55724,55725,55726,55726,55727,55727,55728,
+55728,55729,55729,55730,55730,55731,55731,55732,55733,55733,55734,55734,55735,
+55735,55736,55736,55737,55737,55738,55739,55739,55740,55740,55741,55741,55742,
+55742,55743,55743,55744,55745,55745,55746,55746,55747,55747,55748,55748,55749,
+55749,55750,55751,55751,55752,55752,55753,55753,55754,55754,55755,55755,55756,
+55757,55757,55758,55758,55759,55759,55760,55760,55761,55761,55762,55763,55763,
+55764,55764,55765,55765,55766,55766,55767,55767,55768,55769,55769,55770,55770,
+55771,55771,55772,55772,55773,55773,55774,55774,55775,55776,55776,55777,55777,
+55778,55778,55779,55779,55780,55780,55781,55782,55782,55783,55783,55784,55784,
+55785,55785,55786,55786,55787,55788,55788,55789,55789,55790,55790,55791,55791,
+55792,55792,55793,55794,55794,55795,55795,55796,55796,55797,55797,55798,55798,
+55799,55800,55800,55801,55801,55802,55802,55803,55803,55804,55804,55805,55805,
+55806,55807,55807,55808,55808,55809,55809,55810,55810,55811,55811,55812,55813,
+55813,55814,55814,55815,55815,55816,55816,55817,55817,55818,55819,55819,55820,
+55820,55821,55821,55822,55822,55823,55823,55824,55825,55825,55826,55826,55827,
+55827,55828,55828,55829,55829,55830,55830,55831,55832,55832,55833,55833,55834,
+55834,55835,55835,55836,55836,55837,55838,55838,55839,55839,55840,55840,55841,
+55841,55842,55842,55843,55844,55844,55845,55845,55846,55846,55847,55847,55848,
+55848,55849,55849,55850,55851,55851,55852,55852,55853,55853,55854,55854,55855,
+55855,55856,55857,55857,55858,55858,55859,55859,55860,55860,55861,55861,55862,
+55863,55863,55864,55864,55865,55865,55866,55866,55867,55867,55868,55868,55869,
+55870,55870,55871,55871,55872,55872,55873,55873,55874,55874,55875,55876,55876,
+55877,55877,55878,55878,55879,55879,55880,55880,55881,55882,55882,55883,55883,
+55884,55884,55885,55885,55886,55886,55887,55887,55888,55889,55889,55890,55890,
+55891,55891,55892,55892,55893,55893,55894,55895,55895,55896,55896,55897,55897,
+55898,55898,55899,55899,55900,55901,55901,55902,55902,55903,55903,55904,55904,
+55905,55905,55906,55906,55907,55908,55908,55909,55909,55910,55910,55911,55911,
+55912,55912,55913,55914,55914,55915,55915,55916,55916,55917,55917,55918,55918,
+55919,55919,55920,55921,55921,55922,55922,55923,55923,55924,55924,55925,55925,
+55926,55927,55927,55928,55928,55929,55929,55930,55930,55931,55931,55932,55932,
+55933,55934,55934,55935,55935,55936,55936,55937,55937,55938,55938,55939,55940,
+55940,55941,55941,55942,55942,55943,55943,55944,55944,55945,55945,55946,55947,
+55947,55948,55948,55949,55949,55950,55950,55951,55951,55952,55953,55953,55954,
+55954,55955,55955,55956,55956,55957,55957,55958,55958,55959,55960,55960,55961,
+55961,55962,55962,55963,55963,55964,55964,55965,55966,55966,55967,55967,55968,
+55968,55969,55969,55970,55970,55971,55971,55972,55973,55973,55974,55974,55975,
+55975,55976,55976,55977,55977,55978,55979,55979,55980,55980,55981,55981,55982,
+55982,55983,55983,55984,55984,55985,55986,55986,55987,55987,55988,55988,55989,
+55989,55990,55990,55991,55992,55992,55993,55993,55994,55994,55995,55995,55996,
+55996,55997,55997,55998,55999,55999,56000,56000,56001,56001,56002,56002,56003,
+56003,56004,56005,56005,56006,56006,56007,56007,56008,56008,56009,56009,56010,
+56010,56011,56012,56012,56013,56013,56014,56014,56015,56015,56016,56016,56017,
+56017,56018,56019,56019,56020,56020,56021,56021,56022,56022,56023,56023,56024,
+56025,56025,56026,56026,56027,56027,56028,56028,56029,56029,56030,56030,56031,
+56032,56032,56033,56033,56034,56034,56035,56035,56036,56036,56037,56037,56038,
+56039,56039,56040,56040,56041,56041,56042,56042,56043,56043,56044,56045,56045,
+56046,56046,56047,56047,56048,56048,56049,56049,56050,56050,56051,56052,56052,
+56053,56053,56054,56054,56055,56055,56056,56056,56057,56057,56058,56059,56059,
+56060,56060,56061,56061,56062,56062,56063,56063,56064,56065,56065,56066,56066,
+56067,56067,56068,56068,56069,56069,56070,56070,56071,56072,56072,56073,56073,
+56074,56074,56075,56075,56076,56076,56077,56077,56078,56079,56079,56080,56080,
+56081,56081,56082,56082,56083,56083,56084,56085,56085,56086,56086,56087,56087,
+56088,56088,56089,56089,56090,56090,56091,56092,56092,56093,56093,56094,56094,
+56095,56095,56096,56096,56097,56097,56098,56099,56099,56100,56100,56101,56101,
+56102,56102,56103,56103,56104,56104,56105,56106,56106,56107,56107,56108,56108,
+56109,56109,56110,56110,56111,56111,56112,56113,56113,56114,56114,56115,56115,
+56116,56116,56117,56117,56118,56119,56119,56120,56120,56121,56121,56122,56122,
+56123,56123,56124,56124,56125,56126,56126,56127,56127,56128,56128,56129,56129,
+56130,56130,56131,56131,56132,56133,56133,56134,56134,56135,56135,56136,56136,
+56137,56137,56138,56138,56139,56140,56140,56141,56141,56142,56142,56143,56143,
+56144,56144,56145,56145,56146,56147,56147,56148,56148,56149,56149,56150,56150,
+56151,56151,56152,56152,56153,56154,56154,56155,56155,56156,56156,56157,56157,
+56158,56158,56159,56160,56160,56161,56161,56162,56162,56163,56163,56164,56164,
+56165,56165,56166,56167,56167,56168,56168,56169,56169,56170,56170,56171,56171,
+56172,56172,56173,56174,56174,56175,56175,56176,56176,56177,56177,56178,56178,
+56179,56179,56180,56181,56181,56182,56182,56183,56183,56184,56184,56185,56185,
+56186,56186,56187,56188,56188,56189,56189,56190,56190,56191,56191,56192,56192,
+56193,56193,56194,56195,56195,56196,56196,56197,56197,56198,56198,56199,56199,
+56200,56200,56201,56202,56202,56203,56203,56204,56204,56205,56205,56206,56206,
+56207,56207,56208,56209,56209,56210,56210,56211,56211,56212,56212,56213,56213,
+56214,56214,56215,56216,56216,56217,56217,56218,56218,56219,56219,56220,56220,
+56221,56221,56222,56223,56223,56224,56224,56225,56225,56226,56226,56227,56227,
+56228,56228,56229,56230,56230,56231,56231,56232,56232,56233,56233,56234,56234,
+56235,56235,56236,56237,56237,56238,56238,56239,56239,56240,56240,56241,56241,
+56242,56242,56243,56244,56244,56245,56245,56246,56246,56247,56247,56248,56248,
+56249,56249,56250,56251,56251,56252,56252,56253,56253,56254,56254,56255,56255,
+56256,56256,56257,56257,56258,56259,56259,56260,56260,56261,56261,56262,56262,
+56263,56263,56264,56264,56265,56266,56266,56267,56267,56268,56268,56269,56269,
+56270,56270,56271,56271,56272,56273,56273,56274,56274,56275,56275,56276,56276,
+56277,56277,56278,56278,56279,56280,56280,56281,56281,56282,56282,56283,56283,
+56284,56284,56285,56285,56286,56287,56287,56288,56288,56289,56289,56290,56290,
+56291,56291,56292,56292,56293,56294,56294,56295,56295,56296,56296,56297,56297,
+56298,56298,56299,56299,56300,56301,56301,56302,56302,56303,56303,56304,56304,
+56305,56305,56306,56306,56307,56307,56308,56309,56309,56310,56310,56311,56311,
+56312,56312,56313,56313,56314,56314,56315,56316,56316,56317,56317,56318,56318,
+56319,56319,56320,56320,56321,56321,56322,56323,56323,56324,56324,56325,56325,
+56326,56326,56327,56327,56328,56328,56329,56330,56330,56331,56331,56332,56332,
+56333,56333,56334,56334,56335,56335,56336,56336,56337,56338,56338,56339,56339,
+56340,56340,56341,56341,56342,56342,56343,56343,56344,56345,56345,56346,56346,
+56347,56347,56348,56348,56349,56349,56350,56350,56351,56352,56352,56353,56353,
+56354,56354,56355,56355,56356,56356,56357,56357,56358,56358,56359,56360,56360,
+56361,56361,56362,56362,56363,56363,56364,56364,56365,56365,56366,56367,56367,
+56368,56368,56369,56369,56370,56370,56371,56371,56372,56372,56373,56374,56374,
+56375,56375,56376,56376,56377,56377,56378,56378,56379,56379,56380,56380,56381,
+56382,56382,56383,56383,56384,56384,56385,56385,56386,56386,56387,56387,56388,
+56389,56389,56390,56390,56391,56391,56392,56392,56393,56393,56394,56394,56395,
+56395,56396,56397,56397,56398,56398,56399,56399,56400,56400,56401,56401,56402,
+56402,56403,56404,56404,56405,56405,56406,56406,56407,56407,56408,56408,56409,
+56409,56410,56411,56411,56412,56412,56413,56413,56414,56414,56415,56415,56416,
+56416,56417,56417,56418,56419,56419,56420,56420,56421,56421,56422,56422,56423,
+56423,56424,56424,56425,56426,56426,56427,56427,56428,56428,56429,56429,56430,
+56430,56431,56431,56432,56432,56433,56434,56434,56435,56435,56436,56436,56437,
+56437,56438,56438,56439,56439,56440,56441,56441,56442,56442,56443,56443,56444,
+56444,56445,56445,56446,56446,56447,56447,56448,56449,56449,56450,56450,56451,
+56451,56452,56452,56453,56453,56454,56454,56455,56456,56456,56457,56457,56458,
+56458,56459,56459,56460,56460,56461,56461,56462,56462,56463,56464,56464,56465,
+56465,56466,56466,56467,56467,56468,56468,56469,56469,56470,56470,56471,56472,
+56472,56473,56473,56474,56474,56475,56475,56476,56476,56477,56477,56478,56479,
+56479,56480,56480,56481,56481,56482,56482,56483,56483,56484,56484,56485,56485,
+56486,56487,56487,56488,56488,56489,56489,56490,56490,56491,56491,56492,56492,
+56493,56493,56494,56495,56495,56496,56496,56497,56497,56498,56498,56499,56499,
+56500,56500,56501,56502,56502,56503,56503,56504,56504,56505,56505,56506,56506,
+56507,56507,56508,56508,56509,56510,56510,56511,56511,56512,56512,56513,56513,
+56514,56514,56515,56515,56516,56516,56517,56518,56518,56519,56519,56520,56520,
+56521,56521,56522,56522,56523,56523,56524,56525,56525,56526,56526,56527,56527,
+56528,56528,56529,56529,56530,56530,56531,56531,56532,56533,56533,56534,56534,
+56535,56535,56536,56536,56537,56537,56538,56538,56539,56539,56540,56541,56541,
+56542,56542,56543,56543,56544,56544,56545,56545,56546,56546,56547,56547,56548,
+56549,56549,56550,56550,56551,56551,56552,56552,56553,56553,56554,56554,56555,
+56555,56556,56557,56557,56558,56558,56559,56559,56560,56560,56561,56561,56562,
+56562,56563,56564,56564,56565,56565,56566,56566,56567,56567,56568,56568,56569,
+56569,56570,56570,56571,56572,56572,56573,56573,56574,56574,56575,56575,56576,
+56576,56577,56577,56578,56578,56579,56580,56580,56581,56581,56582,56582,56583,
+56583,56584,56584,56585,56585,56586,56586,56587,56588,56588,56589,56589,56590,
+56590,56591,56591,56592,56592,56593,56593,56594,56594,56595,56596,56596,56597,
+56597,56598,56598,56599,56599,56600,56600,56601,56601,56602,56602,56603,56604,
+56604,56605,56605,56606,56606,56607,56607,56608,56608,56609,56609,56610,56610,
+56611,56612,56612,56613,56613,56614,56614,56615,56615,56616,56616,56617,56617,
+56618,56618,56619,56620,56620,56621,56621,56622,56622,56623,56623,56624,56624,
+56625,56625,56626,56626,56627,56628,56628,56629,56629,56630,56630,56631,56631,
+56632,56632,56633,56633,56634,56634,56635,56636,56636,56637,56637,56638,56638,
+56639,56639,56640,56640,56641,56641,56642,56642,56643,56644,56644,56645,56645,
+56646,56646,56647,56647,56648,56648,56649,56649,56650,56650,56651,56652,56652,
+56653,56653,56654,56654,56655,56655,56656,56656,56657,56657,56658,56658,56659,
+56660,56660,56661,56661,56662,56662,56663,56663,56664,56664,56665,56665,56666,
+56666,56667,56668,56668,56669,56669,56670,56670,56671,56671,56672,56672,56673,
+56673,56674,56674,56675,56676,56676,56677,56677,56678,56678,56679,56679,56680,
+56680,56681,56681,56682,56682,56683,56683,56684,56685,56685,56686,56686,56687,
+56687,56688,56688,56689,56689,56690,56690,56691,56691,56692,56693,56693,56694,
+56694,56695,56695,56696,56696,56697,56697,56698,56698,56699,56699,56700,56701,
+56701,56702,56702,56703,56703,56704,56704,56705,56705,56706,56706,56707,56707,
+56708,56709,56709,56710,56710,56711,56711,56712,56712,56713,56713,56714,56714,
+56715,56715,56716,56716,56717,56718,56718,56719,56719,56720,56720,56721,56721,
+56722,56722,56723,56723,56724,56724,56725,56726,56726,56727,56727,56728,56728,
+56729,56729,56730,56730,56731,56731,56732,56732,56733,56734,56734,56735,56735,
+56736,56736,56737,56737,56738,56738,56739,56739,56740,56740,56741,56741,56742,
+56743,56743,56744,56744,56745,56745,56746,56746,56747,56747,56748,56748,56749,
+56749,56750,56751,56751,56752,56752,56753,56753,56754,56754,56755,56755,56756,
+56756,56757,56757,56758,56759,56759,56760,56760,56761,56761,56762,56762,56763,
+56763,56764,56764,56765,56765,56766,56766,56767,56768,56768,56769,56769,56770,
+56770,56771,56771,56772,56772,56773,56773,56774,56774,56775,56776,56776,56777,
+56777,56778,56778,56779,56779,56780,56780,56781,56781,56782,56782,56783,56783,
+56784,56785,56785,56786,56786,56787,56787,56788,56788,56789,56789,56790,56790,
+56791,56791,56792,56793,56793,56794,56794,56795,56795,56796,56796,56797,56797,
+56798,56798,56799,56799,56800,56800,56801,56802,56802,56803,56803,56804,56804,
+56805,56805,56806,56806,56807,56807,56808,56808,56809,56810,56810,56811,56811,
+56812,56812,56813,56813,56814,56814,56815,56815,56816,56816,56817,56817,56818,
+56819,56819,56820,56820,56821,56821,56822,56822,56823,56823,56824,56824,56825,
+56825,56826,56827,56827,56828,56828,56829,56829,56830,56830,56831,56831,56832,
+56832,56833,56833,56834,56834,56835,56836,56836,56837,56837,56838,56838,56839,
+56839,56840,56840,56841,56841,56842,56842,56843,56843,56844,56845,56845,56846,
+56846,56847,56847,56848,56848,56849,56849,56850,56850,56851,56851,56852,56853,
+56853,56854,56854,56855,56855,56856,56856,56857,56857,56858,56858,56859,56859,
+56860,56860,56861,56862,56862,56863,56863,56864,56864,56865,56865,56866,56866,
+56867,56867,56868,56868,56869,56869,56870,56871,56871,56872,56872,56873,56873,
+56874,56874,56875,56875,56876,56876,56877,56877,56878,56878,56879,56880,56880,
+56881,56881,56882,56882,56883,56883,56884,56884,56885,56885,56886,56886,56887,
+56887,56888,56889,56889,56890,56890,56891,56891,56892,56892,56893,56893,56894,
+56894,56895,56895,56896,56897,56897,56898,56898,56899,56899,56900,56900,56901,
+56901,56902,56902,56903,56903,56904,56904,56905,56906,56906,56907,56907,56908,
+56908,56909,56909,56910,56910,56911,56911,56912,56912,56913,56913,56914,56915,
+56915,56916,56916,56917,56917,56918,56918,56919,56919,56920,56920,56921,56921,
+56922,56922,56923,56924,56924,56925,56925,56926,56926,56927,56927,56928,56928,
+56929,56929,56930,56930,56931,56931,56932,56933,56933,56934,56934,56935,56935,
+56936,56936,56937,56937,56938,56938,56939,56939,56940,56940,56941,56942,56942,
+56943,56943,56944,56944,56945,56945,56946,56946,56947,56947,56948,56948,56949,
+56949,56950,56951,56951,56952,56952,56953,56953,56954,56954,56955,56955,56956,
+56956,56957,56957,56958,56958,56959,56960,56960,56961,56961,56962,56962,56963,
+56963,56964,56964,56965,56965,56966,56966,56967,56967,56968,56969,56969,56970,
+56970,56971,56971,56972,56972,56973,56973,56974,56974,56975,56975,56976,56976,
+56977,56978,56978,56979,56979,56980,56980,56981,56981,56982,56982,56983,56983,
+56984,56984,56985,56985,56986,56986,56987,56988,56988,56989,56989,56990,56990,
+56991,56991,56992,56992,56993,56993,56994,56994,56995,56995,56996,56997,56997,
+56998,56998,56999,56999,57000,57000,57001,57001,57002,57002,57003,57003,57004,
+57004,57005,57006,57006,57007,57007,57008,57008,57009,57009,57010,57010,57011,
+57011,57012,57012,57013,57013,57014,57015,57015,57016,57016,57017,57017,57018,
+57018,57019,57019,57020,57020,57021,57021,57022,57022,57023,57023,57024,57025,
+57025,57026,57026,57027,57027,57028,57028,57029,57029,57030,57030,57031,57031,
+57032,57032,57033,57034,57034,57035,57035,57036,57036,57037,57037,57038,57038,
+57039,57039,57040,57040,57041,57041,57042,57043,57043,57044,57044,57045,57045,
+57046,57046,57047,57047,57048,57048,57049,57049,57050,57050,57051,57051,57052,
+57053,57053,57054,57054,57055,57055,57056,57056,57057,57057,57058,57058,57059,
+57059,57060,57060,57061,57062,57062,57063,57063,57064,57064,57065,57065,57066,
+57066,57067,57067,57068,57068,57069,57069,57070,57070,57071,57072,57072,57073,
+57073,57074,57074,57075,57075,57076,57076,57077,57077,57078,57078,57079,57079,
+57080,57081,57081,57082,57082,57083,57083,57084,57084,57085,57085,57086,57086,
+57087,57087,57088,57088,57089,57089,57090,57091,57091,57092,57092,57093,57093,
+57094,57094,57095,57095,57096,57096,57097,57097,57098,57098,57099,57100,57100,
+57101,57101,57102,57102,57103,57103,57104,57104,57105,57105,57106,57106,57107,
+57107,57108,57108,57109,57110,57110,57111,57111,57112,57112,57113,57113,57114,
+57114,57115,57115,57116,57116,57117,57117,57118,57118,57119,57120,57120,57121,
+57121,57122,57122,57123,57123,57124,57124,57125,57125,57126,57126,57127,57127,
+57128,57129,57129,57130,57130,57131,57131,57132,57132,57133,57133,57134,57134,
+57135,57135,57136,57136,57137,57137,57138,57139,57139,57140,57140,57141,57141,
+57142,57142,57143,57143,57144,57144,57145,57145,57146,57146,57147,57147,57148,
+57149,57149,57150,57150,57151,57151,57152,57152,57153,57153,57154,57154,57155,
+57155,57156,57156,57157,57157,57158,57159,57159,57160,57160,57161,57161,57162,
+57162,57163,57163,57164,57164,57165,57165,57166,57166,57167,57167,57168,57169,
+57169,57170,57170,57171,57171,57172,57172,57173,57173,57174,57174,57175,57175,
+57176,57176,57177,57177,57178,57179,57179,57180,57180,57181,57181,57182,57182,
+57183,57183,57184,57184,57185,57185,57186,57186,57187,57187,57188,57189,57189,
+57190,57190,57191,57191,57192,57192,57193,57193,57194,57194,57195,57195,57196,
+57196,57197,57197,57198,57199,57199,57200,57200,57201,57201,57202,57202,57203,
+57203,57204,57204,57205,57205,57206,57206,57207,57207,57208,57209,57209,57210,
+57210,57211,57211,57212,57212,57213,57213,57214,57214,57215,57215,57216,57216,
+57217,57217,57218,57219,57219,57220,57220,57221,57221,57222,57222,57223,57223,
+57224,57224,57225,57225,57226,57226,57227,57227,57228,57229,57229,57230,57230,
+57231,57231,57232,57232,57233,57233,57234,57234,57235,57235,57236,57236,57237,
+57237,57238,57239,57239,57240,57240,57241,57241,57242,57242,57243,57243,57244,
+57244,57245,57245,57246,57246,57247,57247,57248,57249,57249,57250,57250,57251,
+57251,57252,57252,57253,57253,57254,57254,57255,57255,57256,57256,57257,57257,
+57258,57258,57259,57260,57260,57261,57261,57262,57262,57263,57263,57264,57264,
+57265,57265,57266,57266,57267,57267,57268,57268,57269,57270,57270,57271,57271,
+57272,57272,57273,57273,57274,57274,57275,57275,57276,57276,57277,57277,57278,
+57278,57279,57280,57280,57281,57281,57282,57282,57283,57283,57284,57284,57285,
+57285,57286,57286,57287,57287,57288,57288,57289,57289,57290,57291,57291,57292,
+57292,57293,57293,57294,57294,57295,57295,57296,57296,57297,57297,57298,57298,
+57299,57299,57300,57301,57301,57302,57302,57303,57303,57304,57304,57305,57305,
+57306,57306,57307,57307,57308,57308,57309,57309,57310,57310,57311,57312,57312,
+57313,57313,57314,57314,57315,57315,57316,57316,57317,57317,57318,57318,57319,
+57319,57320,57320,57321,57322,57322,57323,57323,57324,57324,57325,57325,57326,
+57326,57327,57327,57328,57328,57329,57329,57330,57330,57331,57331,57332,57333,
+57333,57334,57334,57335,57335,57336,57336,57337,57337,57338,57338,57339,57339,
+57340,57340,57341,57341,57342,57342,57343,57344,57344,57345,57345,57346,57346,
+57347,57347,57348,57348,57349,57349,57350,57350,57351,57351,57352,57352,57353,
+57354,57354,57355,57355,57356,57356,57357,57357,57358,57358,57359,57359,57360,
+57360,57361,57361,57362,57362,57363,57363,57364,57365,57365,57366,57366,57367,
+57367,57368,57368,57369,57369,57370,57370,57371,57371,57372,57372,57373,57373,
+57374,57374,57375,57376,57376,57377,57377,57378,57378,57379,57379,57380,57380,
+57381,57381,57382,57382,57383,57383,57384,57384,57385,57385,57386,57387,57387,
+57388,57388,57389,57389,57390,57390,57391,57391,57392,57392,57393,57393,57394,
+57394,57395,57395,57396,57396,57397,57398,57398,57399,57399,57400,57400,57401,
+57401,57402,57402,57403,57403,57404,57404,57405,57405,57406,57406,57407,57407,
+57408,57409,57409,57410,57410,57411,57411,57412,57412,57413,57413,57414,57414,
+57415,57415,57416,57416,57417,57417,57418,57418,57419,57420,57420,57421,57421,
+57422,57422,57423,57423,57424,57424,57425,57425,57426,57426,57427,57427,57428,
+57428,57429,57429,57430,57431,57431,57432,57432,57433,57433,57434,57434,57435,
+57435,57436,57436,57437,57437,57438,57438,57439,57439,57440,57440,57441,57442,
+57442,57443,57443,57444,57444,57445,57445,57446,57446,57447,57447,57448,57448,
+57449,57449,57450,57450,57451,57451,57452,57452,57453,57454,57454,57455,57455,
+57456,57456,57457,57457,57458,57458,57459,57459,57460,57460,57461,57461,57462,
+57462,57463,57463,57464,57465,57465,57466,57466,57467,57467,57468,57468,57469,
+57469,57470,57470,57471,57471,57472,57472,57473,57473,57474,57474,57475,57476,
+57476,57477,57477,57478,57478,57479,57479,57480,57480,57481,57481,57482,57482,
+57483,57483,57484,57484,57485,57485,57486,57486,57487,57488,57488,57489,57489,
+57490,57490,57491,57491,57492,57492,57493,57493,57494,57494,57495,57495,57496,
+57496,57497,57497,57498,57499,57499,57500,57500,57501,57501,57502,57502,57503,
+57503,57504,57504,57505,57505,57506,57506,57507,57507,57508,57508,57509,57509,
+57510,57511,57511,57512,57512,57513,57513,57514,57514,57515,57515,57516,57516,
+57517,57517,57518,57518,57519,57519,57520,57520,57521,57522,57522,57523,57523,
+57524,57524,57525,57525,57526,57526,57527,57527,57528,57528,57529,57529,57530,
+57530,57531,57531,57532,57532,57533,57534,57534,57535,57535,57536,57536,57537,
+57537,57538,57538,57539,57539,57540,57540,57541,57541,57542,57542,57543,57543,
+57544,57544,57545,57546,57546,57547,57547,57548,57548,57549,57549,57550,57550,
+57551,57551,57552,57552,57553,57553,57554,57554,57555,57555,57556,57556,57557,
+57558,57558,57559,57559,57560,57560,57561,57561,57562,57562,57563,57563,57564,
+57564,57565,57565,57566,57566,57567,57567,57568,57568,57569,57570,57570,57571,
+57571,57572,57572,57573,57573,57574,57574,57575,57575,57576,57576,57577,57577,
+57578,57578,57579,57579,57580,57580,57581,57582,57582,57583,57583,57584,57584,
+57585,57585,57586,57586,57587,57587,57588,57588,57589,57589,57590,57590,57591,
+57591,57592,57592,57593,57594,57594,57595,57595,57596,57596,57597,57597,57598,
+57598,57599,57599,57600,57600,57601,57601,57602,57602,57603,57603,57604,57604,
+57605,57606,57606,57607,57607,57608,57608,57609,57609,57610,57610,57611,57611,
+57612,57612,57613,57613,57614,57614,57615,57615,57616,57616,57617,57618,57618,
+57619,57619,57620,57620,57621,57621,57622,57622,57623,57623,57624,57624,57625,
+57625,57626,57626,57627,57627,57628,57628,57629,57629,57630,57631,57631,57632,
+57632,57633,57633,57634,57634,57635,57635,57636,57636,57637,57637,57638,57638,
+57639,57639,57640,57640,57641,57641,57642,57643,57643,57644,57644,57645,57645,
+57646,57646,57647,57647,57648,57648,57649,57649,57650,57650,57651,57651,57652,
+57652,57653,57653,57654,57654,57655,57656,57656,57657,57657,57658,57658,57659,
+57659,57660,57660,57661,57661,57662,57662,57663,57663,57664,57664,57665,57665,
+57666,57666,57667,57668,57668,57669,57669,57670,57670,57671,57671,57672,57672,
+57673,57673,57674,57674,57675,57675,57676,57676,57677,57677,57678,57678,57679,
+57679,57680,57681,57681,57682,57682,57683,57683,57684,57684,57685,57685,57686,
+57686,57687,57687,57688,57688,57689,57689,57690,57690,57691,57691,57692,57692,
+57693,57694,57694,57695,57695,57696,57696,57697,57697,57698,57698,57699,57699,
+57700,57700,57701,57701,57702,57702,57703,57703,57704,57704,57705,57705,57706,
+57707,57707,57708,57708,57709,57709,57710,57710,57711,57711,57712,57712,57713,
+57713,57714,57714,57715,57715,57716,57716,57717,57717,57718,57718,57719,57720,
+57720,57721,57721,57722,57722,57723,57723,57724,57724,57725,57725,57726,57726,
+57727,57727,57728,57728,57729,57729,57730,57730,57731,57731,57732,57733,57733,
+57734,57734,57735,57735,57736,57736,57737,57737,57738,57738,57739,57739,57740,
+57740,57741,57741,57742,57742,57743,57743,57744,57744,57745,57746,57746,57747,
+57747,57748,57748,57749,57749,57750,57750,57751,57751,57752,57752,57753,57753,
+57754,57754,57755,57755,57756,57756,57757,57757,57758,57759,57759,57760,57760,
+57761,57761,57762,57762,57763,57763,57764,57764,57765,57765,57766,57766,57767,
+57767,57768,57768,57769,57769,57770,57770,57771,57772,57772,57773,57773,57774,
+57774,57775,57775,57776,57776,57777,57777,57778,57778,57779,57779,57780,57780,
+57781,57781,57782,57782,57783,57783,57784,57784,57785,57786,57786,57787,57787,
+57788,57788,57789,57789,57790,57790,57791,57791,57792,57792,57793,57793,57794,
+57794,57795,57795,57796,57796,57797,57797,57798,57799,57799,57800,57800,57801,
+57801,57802,57802,57803,57803,57804,57804,57805,57805,57806,57806,57807,57807,
+57808,57808,57809,57809,57810,57810,57811,57811,57812,57813,57813,57814,57814,
+57815,57815,57816,57816,57817,57817,57818,57818,57819,57819,57820,57820,57821,
+57821,57822,57822,57823,57823,57824,57824,57825,57825,57826,57827,57827,57828,
+57828,57829,57829,57830,57830,57831,57831,57832,57832,57833,57833,57834,57834,
+57835,57835,57836,57836,57837,57837,57838,57838,57839,57839,57840,57841,57841,
+57842,57842,57843,57843,57844,57844,57845,57845,57846,57846,57847,57847,57848,
+57848,57849,57849,57850,57850,57851,57851,57852,57852,57853,57853,57854,57855,
+57855,57856,57856,57857,57857,57858,57858,57859,57859,57860,57860,57861,57861,
+57862,57862,57863,57863,57864,57864,57865,57865,57866,57866,57867,57867,57868,
+57869,57869,57870,57870,57871,57871,57872,57872,57873,57873,57874,57874,57875,
+57875,57876,57876,57877,57877,57878,57878,57879,57879,57880,57880,57881,57881,
+57882,57883,57883,57884,57884,57885,57885,57886,57886,57887,57887,57888,57888,
+57889,57889,57890,57890,57891,57891,57892,57892,57893,57893,57894,57894,57895,
+57895,57896,57896,57897,57898,57898,57899,57899,57900,57900,57901,57901,57902,
+57902,57903,57903,57904,57904,57905,57905,57906,57906,57907,57907,57908,57908,
+57909,57909,57910,57910,57911,57912,57912,57913,57913,57914,57914,57915,57915,
+57916,57916,57917,57917,57918,57918,57919,57919,57920,57920,57921,57921,57922,
+57922,57923,57923,57924,57924,57925,57925,57926,57927,57927,57928,57928,57929,
+57929,57930,57930,57931,57931,57932,57932,57933,57933,57934,57934,57935,57935,
+57936,57936,57937,57937,57938,57938,57939,57939,57940,57940,57941,57942,57942,
+57943,57943,57944,57944,57945,57945,57946,57946,57947,57947,57948,57948,57949,
+57949,57950,57950,57951,57951,57952,57952,57953,57953,57954,57954,57955,57955,
+57956,57957,57957,57958,57958,57959,57959,57960,57960,57961,57961,57962,57962,
+57963,57963,57964,57964,57965,57965,57966,57966,57967,57967,57968,57968,57969,
+57969,57970,57970,57971,57972,57972,57973,57973,57974,57974,57975,57975,57976,
+57976,57977,57977,57978,57978,57979,57979,57980,57980,57981,57981,57982,57982,
+57983,57983,57984,57984,57985,57985,57986,57987,57987,57988,57988,57989,57989,
+57990,57990,57991,57991,57992,57992,57993,57993,57994,57994,57995,57995,57996,
+57996,57997,57997,57998,57998,57999,57999,58000,58000,58001,58001,58002,58003,
+58003,58004,58004,58005,58005,58006,58006,58007,58007,58008,58008,58009,58009,
+58010,58010,58011,58011,58012,58012,58013,58013,58014,58014,58015,58015,58016,
+58016,58017,58018,58018,58019,58019,58020,58020,58021,58021,58022,58022,58023,
+58023,58024,58024,58025,58025,58026,58026,58027,58027,58028,58028,58029,58029,
+58030,58030,58031,58031,58032,58032,58033,58034,58034,58035,58035,58036,58036,
+58037,58037,58038,58038,58039,58039,58040,58040,58041,58041,58042,58042,58043,
+58043,58044,58044,58045,58045,58046,58046,58047,58047,58048,58048,58049,58050,
+58050,58051,58051,58052,58052,58053,58053,58054,58054,58055,58055,58056,58056,
+58057,58057,58058,58058,58059,58059,58060,58060,58061,58061,58062,58062,58063,
+58063,58064,58064,58065,58066,58066,58067,58067,58068,58068,58069,58069,58070,
+58070,58071,58071,58072,58072,58073,58073,58074,58074,58075,58075,58076,58076,
+58077,58077,58078,58078,58079,58079,58080,58080,58081,58081,58082,58083,58083,
+58084,58084,58085,58085,58086,58086,58087,58087,58088,58088,58089,58089,58090,
+58090,58091,58091,58092,58092,58093,58093,58094,58094,58095,58095,58096,58096,
+58097,58097,58098,58099,58099,58100,58100,58101,58101,58102,58102,58103,58103,
+58104,58104,58105,58105,58106,58106,58107,58107,58108,58108,58109,58109,58110,
+58110,58111,58111,58112,58112,58113,58113,58114,58114,58115,58116,58116,58117,
+58117,58118,58118,58119,58119,58120,58120,58121,58121,58122,58122,58123,58123,
+58124,58124,58125,58125,58126,58126,58127,58127,58128,58128,58129,58129,58130,
+58130,58131,58131,58132,58133,58133,58134,58134,58135,58135,58136,58136,58137,
+58137,58138,58138,58139,58139,58140,58140,58141,58141,58142,58142,58143,58143,
+58144,58144,58145,58145,58146,58146,58147,58147,58148,58148,58149,58150,58150,
+58151,58151,58152,58152,58153,58153,58154,58154,58155,58155,58156,58156,58157,
+58157,58158,58158,58159,58159,58160,58160,58161,58161,58162,58162,58163,58163,
+58164,58164,58165,58165,58166,58167,58167,58168,58168,58169,58169,58170,58170,
+58171,58171,58172,58172,58173,58173,58174,58174,58175,58175,58176,58176,58177,
+58177,58178,58178,58179,58179,58180,58180,58181,58181,58182,58182,58183,58183,
+58184,58185,58185,58186,58186,58187,58187,58188,58188,58189,58189,58190,58190,
+58191,58191,58192,58192,58193,58193,58194,58194,58195,58195,58196,58196,58197,
+58197,58198,58198,58199,58199,58200,58200,58201,58201,58202,58203,58203,58204,
+58204,58205,58205,58206,58206,58207,58207,58208,58208,58209,58209,58210,58210,
+58211,58211,58212,58212,58213,58213,58214,58214,58215,58215,58216,58216,58217,
+58217,58218,58218,58219,58219,58220,58221,58221,58222,58222,58223,58223,58224,
+58224,58225,58225,58226,58226,58227,58227,58228,58228,58229,58229,58230,58230,
+58231,58231,58232,58232,58233,58233,58234,58234,58235,58235,58236,58236,58237,
+58237,58238,58239,58239,58240,58240,58241,58241,58242,58242,58243,58243,58244,
+58244,58245,58245,58246,58246,58247,58247,58248,58248,58249,58249,58250,58250,
+58251,58251,58252,58252,58253,58253,58254,58254,58255,58255,58256,58256,58257,
+58258,58258,58259,58259,58260,58260,58261,58261,58262,58262,58263,58263,58264,
+58264,58265,58265,58266,58266,58267,58267,58268,58268,58269,58269,58270,58270,
+58271,58271,58272,58272,58273,58273,58274,58274,58275,58275,58276,58277,58277,
+58278,58278,58279,58279,58280,58280,58281,58281,58282,58282,58283,58283,58284,
+58284,58285,58285,58286,58286,58287,58287,58288,58288,58289,58289,58290,58290,
+58291,58291,58292,58292,58293,58293,58294,58294,58295,58296,58296,58297,58297,
+58298,58298,58299,58299,58300,58300,58301,58301,58302,58302,58303,58303,58304,
+58304,58305,58305,58306,58306,58307,58307,58308,58308,58309,58309,58310,58310,
+58311,58311,58312,58312,58313,58313,58314,58314,58315,58316,58316,58317,58317,
+58318,58318,58319,58319,58320,58320,58321,58321,58322,58322,58323,58323,58324,
+58324,58325,58325,58326,58326,58327,58327,58328,58328,58329,58329,58330,58330,
+58331,58331,58332,58332,58333,58333,58334,58334,58335,58336,58336,58337,58337,
+58338,58338,58339,58339,58340,58340,58341,58341,58342,58342,58343,58343,58344,
+58344,58345,58345,58346,58346,58347,58347,58348,58348,58349,58349,58350,58350,
+58351,58351,58352,58352,58353,58353,58354,58354,58355,58356,58356,58357,58357,
+58358,58358,58359,58359,58360,58360,58361,58361,58362,58362,58363,58363,58364,
+58364,58365,58365,58366,58366,58367,58367,58368,58368,58369,58369,58370,58370,
+58371,58371,58372,58372,58373,58373,58374,58374,58375,58375,58376,58377,58377,
+58378,58378,58379,58379,58380,58380,58381,58381,58382,58382,58383,58383,58384,
+58384,58385,58385,58386,58386,58387,58387,58388,58388,58389,58389,58390,58390,
+58391,58391,58392,58392,58393,58393,58394,58394,58395,58395,58396,58396,58397,
+58398,58398,58399,58399,58400,58400,58401,58401,58402,58402,58403,58403,58404,
+58404,58405,58405,58406,58406,58407,58407,58408,58408,58409,58409,58410,58410,
+58411,58411,58412,58412,58413,58413,58414,58414,58415,58415,58416,58416,58417,
+58417,58418,58419,58419,58420,58420,58421,58421,58422,58422,58423,58423,58424,
+58424,58425,58425,58426,58426,58427,58427,58428,58428,58429,58429,58430,58430,
+58431,58431,58432,58432,58433,58433,58434,58434,58435,58435,58436,58436,58437,
+58437,58438,58438,58439,58439,58440,58441,58441,58442,58442,58443,58443,58444,
+58444,58445,58445,58446,58446,58447,58447,58448,58448,58449,58449,58450,58450,
+58451,58451,58452,58452,58453,58453,58454,58454,58455,58455,58456,58456,58457,
+58457,58458,58458,58459,58459,58460,58460,58461,58461,58462,58463,58463,58464,
+58464,58465,58465,58466,58466,58467,58467,58468,58468,58469,58469,58470,58470,
+58471,58471,58472,58472,58473,58473,58474,58474,58475,58475,58476,58476,58477,
+58477,58478,58478,58479,58479,58480,58480,58481,58481,58482,58482,58483,58483,
+58484,58484,58485,58486,58486,58487,58487,58488,58488,58489,58489,58490,58490,
+58491,58491,58492,58492,58493,58493,58494,58494,58495,58495,58496,58496,58497,
+58497,58498,58498,58499,58499,58500,58500,58501,58501,58502,58502,58503,58503,
+58504,58504,58505,58505,58506,58506,58507,58507,58508,58508,58509,58510,58510,
+58511,58511,58512,58512,58513,58513,58514,58514,58515,58515,58516,58516,58517,
+58517,58518,58518,58519,58519,58520,58520,58521,58521,58522,58522,58523,58523,
+58524,58524,58525,58525,58526,58526,58527,58527,58528,58528,58529,58529,58530,
+58530,58531,58531,58532,58532,58533,58534,58534,58535,58535,58536,58536,58537,
+58537,58538,58538,58539,58539,58540,58540,58541,58541,58542,58542,58543,58543,
+58544,58544,58545,58545,58546,58546,58547,58547,58548,58548,58549,58549,58550,
+58550,58551,58551,58552,58552,58553,58553,58554,58554,58555,58555,58556,58556,
+58557,58557,58558,58559,58559,58560,58560,58561,58561,58562,58562,58563,58563,
+58564,58564,58565,58565,58566,58566,58567,58567,58568,58568,58569,58569,58570,
+58570,58571,58571,58572,58572,58573,58573,58574,58574,58575,58575,58576,58576,
+58577,58577,58578,58578,58579,58579,58580,58580,58581,58581,58582,58582,58583,
+58584,58584,58585,58585,58586,58586,58587,58587,58588,58588,58589,58589,58590,
+58590,58591,58591,58592,58592,58593,58593,58594,58594,58595,58595,58596,58596,
+58597,58597,58598,58598,58599,58599,58600,58600,58601,58601,58602,58602,58603,
+58603,58604,58604,58605,58605,58606,58606,58607,58607,58608,58608,58609,58610,
+58610,58611,58611,58612,58612,58613,58613,58614,58614,58615,58615,58616,58616,
+58617,58617,58618,58618,58619,58619,58620,58620,58621,58621,58622,58622,58623,
+58623,58624,58624,58625,58625,58626,58626,58627,58627,58628,58628,58629,58629,
+58630,58630,58631,58631,58632,58632,58633,58633,58634,58634,58635,58635,58636,
+58637,58637,58638,58638,58639,58639,58640,58640,58641,58641,58642,58642,58643,
+58643,58644,58644,58645,58645,58646,58646,58647,58647,58648,58648,58649,58649,
+58650,58650,58651,58651,58652,58652,58653,58653,58654,58654,58655,58655,58656,
+58656,58657,58657,58658,58658,58659,58659,58660,58660,58661,58661,58662,58662,
+58663,58663,58664,58665,58665,58666,58666,58667,58667,58668,58668,58669,58669,
+58670,58670,58671,58671,58672,58672,58673,58673,58674,58674,58675,58675,58676,
+58676,58677,58677,58678,58678,58679,58679,58680,58680,58681,58681,58682,58682,
+58683,58683,58684,58684,58685,58685,58686,58686,58687,58687,58688,58688,58689,
+58689,58690,58690,58691,58691,58692,58692,58693,58694,58694,58695,58695,58696,
+58696,58697,58697,58698,58698,58699,58699,58700,58700,58701,58701,58702,58702,
+58703,58703,58704,58704,58705,58705,58706,58706,58707,58707,58708,58708,58709,
+58709,58710,58710,58711,58711,58712,58712,58713,58713,58714,58714,58715,58715,
+58716,58716,58717,58717,58718,58718,58719,58719,58720,58720,58721,58721,58722,
+58722,58723,58724,58724,58725,58725,58726,58726,58727,58727,58728,58728,58729,
+58729,58730,58730,58731,58731,58732,58732,58733,58733,58734,58734,58735,58735,
+58736,58736,58737,58737,58738,58738,58739,58739,58740,58740,58741,58741,58742,
+58742,58743,58743,58744,58744,58745,58745,58746,58746,58747,58747,58748,58748,
+58749,58749,58750,58750,58751,58751,58752,58752,58753,58753,58754,58755,58755,
+58756,58756,58757,58757,58758,58758,58759,58759,58760,58760,58761,58761,58762,
+58762,58763,58763,58764,58764,58765,58765,58766,58766,58767,58767,58768,58768,
+58769,58769,58770,58770,58771,58771,58772,58772,58773,58773,58774,58774,58775,
+58775,58776,58776,58777,58777,58778,58778,58779,58779,58780,58780,58781,58781,
+58782,58782,58783,58783,58784,58784,58785,58785,58786,58786,58787,58788,58788,
+58789,58789,58790,58790,58791,58791,58792,58792,58793,58793,58794,58794,58795,
+58795,58796,58796,58797,58797,58798,58798,58799,58799,58800,58800,58801,58801,
+58802,58802,58803,58803,58804,58804,58805,58805,58806,58806,58807,58807,58808,
+58808,58809,58809,58810,58810,58811,58811,58812,58812,58813,58813,58814,58814,
+58815,58815,58816,58816,58817,58817,58818,58818,58819,58819,58820,58820,58821,
+58821,58822,58823,58823,58824,58824,58825,58825,58826,58826,58827,58827,58828,
+58828,58829,58829,58830,58830,58831,58831,58832,58832,58833,58833,58834,58834,
+58835,58835,58836,58836,58837,58837,58838,58838,58839,58839,58840,58840,58841,
+58841,58842,58842,58843,58843,58844,58844,58845,58845,58846,58846,58847,58847,
+58848,58848,58849,58849,58850,58850,58851,58851,58852,58852,58853,58853,58854,
+58854,58855,58855,58856,58856,58857,58857,58858,58859,58859,58860,58860,58861,
+58861,58862,58862,58863,58863,58864,58864,58865,58865,58866,58866,58867,58867,
+58868,58868,58869,58869,58870,58870,58871,58871,58872,58872,58873,58873,58874,
+58874,58875,58875,58876,58876,58877,58877,58878,58878,58879,58879,58880,58880,
+58881,58881,58882,58882,58883,58883,58884,58884,58885,58885,58886,58886,58887,
+58887,58888,58888,58889,58889,58890,58890,58891,58891,58892,58892,58893,58893,
+58894,58894,58895,58895,58896,58896,58897,58898,58898,58899,58899,58900,58900,
+58901,58901,58902,58902,58903,58903,58904,58904,58905,58905,58906,58906,58907,
+58907,58908,58908,58909,58909,58910,58910,58911,58911,58912,58912,58913,58913,
+58914,58914,58915,58915,58916,58916,58917,58917,58918,58918,58919,58919,58920,
+58920,58921,58921,58922,58922,58923,58923,58924,58924,58925,58925,58926,58926,
+58927,58927,58928,58928,58929,58929,58930,58930,58931,58931,58932,58932,58933,
+58933,58934,58934,58935,58935,58936,58936,58937,58937,58938,58938,58939,58940,
+58940,58941,58941,58942,58942,58943,58943,58944,58944,58945,58945,58946,58946,
+58947,58947,58948,58948,58949,58949,58950,58950,58951,58951,58952,58952,58953,
+58953,58954,58954,58955,58955,58956,58956,58957,58957,58958,58958,58959,58959,
+58960,58960,58961,58961,58962,58962,58963,58963,58964,58964,58965,58965,58966,
+58966,58967,58967,58968,58968,58969,58969,58970,58970,58971,58971,58972,58972,
+58973,58973,58974,58974,58975,58975,58976,58976,58977,58977,58978,58978,58979,
+58979,58980,58980,58981,58981,58982,58982,58983,58983,58984,58985,58985,58986,
+58986,58987,58987,58988,58988,58989,58989,58990,58990,58991,58991,58992,58992,
+58993,58993,58994,58994,58995,58995,58996,58996,58997,58997,58998,58998,58999,
+58999,59000,59000,59001,59001,59002,59002,59003,59003,59004,59004,59005,59005,
+59006,59006,59007,59007,59008,59008,59009,59009,59010,59010,59011,59011,59012,
+59012,59013,59013,59014,59014,59015,59015,59016,59016,59017,59017,59018,59018,
+59019,59019,59020,59020,59021,59021,59022,59022,59023,59023,59024,59024,59025,
+59025,59026,59026,59027,59027,59028,59028,59029,59029,59030,59030,59031,59031,
+59032,59032,59033,59033,59034,59035,59035,59036,59036,59037,59037,59038,59038,
+59039,59039,59040,59040,59041,59041,59042,59042,59043,59043,59044,59044,59045,
+59045,59046,59046,59047,59047,59048,59048,59049,59049,59050,59050,59051,59051,
+59052,59052,59053,59053,59054,59054,59055,59055,59056,59056,59057,59057,59058,
+59058,59059,59059,59060,59060,59061,59061,59062,59062,59063,59063,59064,59064,
+59065,59065,59066,59066,59067,59067,59068,59068,59069,59069,59070,59070,59071,
+59071,59072,59072,59073,59073,59074,59074,59075,59075,59076,59076,59077,59077,
+59078,59078,59079,59079,59080,59080,59081,59081,59082,59082,59083,59083,59084,
+59084,59085,59085,59086,59086,59087,59087,59088,59088,59089,59089,59090,59090,
+59091,59092,59092,59093,59093,59094,59094,59095,59095,59096,59096,59097,59097,
+59098,59098,59099,59099,59100,59100,59101,59101,59102,59102,59103,59103,59104,
+59104,59105,59105,59106,59106,59107,59107,59108,59108,59109,59109,59110,59110,
+59111,59111,59112,59112,59113,59113,59114,59114,59115,59115,59116,59116,59117,
+59117,59118,59118,59119,59119,59120,59120,59121,59121,59122,59122,59123,59123,
+59124,59124,59125,59125,59126,59126,59127,59127,59128,59128,59129,59129,59130,
+59130,59131,59131,59132,59132,59133,59133,59134,59134,59135,59135,59136,59136,
+59137,59137,59138,59138,59139,59139,59140,59140,59141,59141,59142,59142,59143,
+59143,59144,59144,59145,59145,59146,59146,59147,59147,59148,59148,59149,59149,
+59150,59150,59151,59151,59152,59152,59153,59153,59154,59154,59155,59155,59156,
+59156,59157,59157,59158,59158,59159,59160,59160,59161,59161,59162,59162,59163,
+59163,59164,59164,59165,59165,59166,59166,59167,59167,59168,59168,59169,59169,
+59170,59170,59171,59171,59172,59172,59173,59173,59174,59174,59175,59175,59176,
+59176,59177,59177,59178,59178,59179,59179,59180,59180,59181,59181,59182,59182,
+59183,59183,59184,59184,59185,59185,59186,59186,59187,59187,59188,59188,59189,
+59189,59190,59190,59191,59191,59192,59192,59193,59193,59194,59194,59195,59195,
+59196,59196,59197,59197,59198,59198,59199,59199,59200,59200,59201,59201,59202,
+59202,59203,59203,59204,59204,59205,59205,59206,59206,59207,59207,59208,59208,
+59209,59209,59210,59210,59211,59211,59212,59212,59213,59213,59214,59214,59215,
+59215,59216,59216,59217,59217,59218,59218,59219,59219,59220,59220,59221,59221,
+59222,59222,59223,59223,59224,59224,59225,59225,59226,59226,59227,59227,59228,
+59228,59229,59229,59230,59230,59231,59231,59232,59232,59233,59233,59234,59234,
+59235,59235,59236,59236,59237,59237,59238,59238,59239,59239,59240,59240,59241,
+59241,59242,59242,59243,59243,59244,59244,59245,59245,59246,59247,59247,59248,
+59248,59249,59249,59250,59250,59251,59251,59252,59252,59253,59253,59254,59254,
+59255,59255,59256,59256,59257,59257,59258,59258,59259,59259,59260,59260,59261,
+59261,59262,59262,59263,59263,59264,59264,59265,59265,59266,59266,59267,59267,
+59268,59268,59269,59269,59270,59270,59271,59271,59272,59272,59273,59273,59274,
+59274,59275,59275,59276,59276,59277,59277,59278,59278,59279,59279,59280,59280,
+59281,59281,59282,59282,59283,59283,59284,59284,59285,59285,59286,59286,59287,
+59287,59288,59288,59289,59289,59290,59290,59291,59291,59292,59292,59293,59293,
+59294,59294,59295,59295,59296,59296,59297,59297,59298,59298,59299,59299,59300,
+59300,59301,59301,59302,59302,59303,59303,59304,59304,59305,59305,59306,59306,
+59307,59307,59308,59308,59309,59309,59310,59310,59311,59311,59312,59312,59313,
+59313,59314,59314,59315,59315,59316,59316,59317,59317,59318,59318,59319,59319,
+59320,59320,59321,59321,59322,59322,59323,59323,59324,59324,59325,59325,59326,
+59326,59327,59327,59328,59328,59329,59329,59330,59330,59331,59331,59332,59332,
+59333,59333,59334,59334,59335,59335,59336,59336,59337,59337,59338,59338,59339,
+59339,59340,59340,59341,59341,59342,59342,59343,59343,59344,59344,59345,59345,
+59346,59346,59347,59347,59348,59348,59349,59349,59350,59350,59351,59351,59352,
+59352,59353,59353,59354,59354,59355,59355,59356,59356,59357,59357,59358,59358,
+59359,59359,59360,59360,59361,59361,59362,59362,59363,59363,59364,59364,59365,
+59365,59366,59366,59367,59367,59368,59368,59369,59369,59370,59370,59371,59371,
+59372,59372,59373,59373,59374,59374,59375,59375,59376,59376,59377,59377,59378,
+59378,59379,59379,59380,59380,59381,59381,59382,59382,59383,59383,59384,59384,
+59385,59385,59386,59386,59387,59387,59388,59388,59389,59389,59390,59390,59391,
+59391,59392,59392,59393,59393,59394,59394,59395,59395,59396,59396,59397,59397,
+59398,59398,59399,59399,59400,59400,59401,59401,59402,59402,59403,59403,59404,
+59404,59405,59405,59406,59406,59407,59407,59408,59408,59409,59409,59410,59410,
+59411,59411,59412,59412,59413,59413,59414,59414,59415,59415,59416,59416,59417,
+59417,59418,59418,59419,59419,59420,59420,59421,59421,59422,59422,59423,59423,
+59424,59424,59425,59425,59426,59426,59427,59427,59428,59428,59429,59429,59430,
+59430,59431,59431,59432,59432,59433,59433,59434,59434,59435,59435,59436,59436,
+59437,59437,59438,59438,59439,59439,59440,59440,59441,59441,59442,59442,59443,
+59443,59444,59444,59445,59445,59446,59446,59447,59447,59448,59448,59449,59449,
+59450,59450,59451,59452,59452,59453,59453,59454,59454,59455,59455,59456,59456,
+59457,59457,59458,59458,59459,59459,59460,59460,59461,59461,59462,59462,59463,
+59463,59464,59464,59465,59465,59466,59466,59467,59467,59467,59468,59468,59469,
+59469,59470,59470,59471,59471,59472,59472,59473,59473,59474,59474,59475,59475,
+59476,59476,59477,59477,59478,59478,59479,59479,59480,59480,59481,59481,59482,
+59482,59483,59483,59484,59484,59485,59485,59486,59486,59487,59487,59488,59488,
+59489,59489,59490,59490,59491,59491,59492,59492,59493,59493,59494,59494,59495,
+59495,59496,59496,59497,59497,59498,59498,59499,59499,59500,59500,59501,59501,
+59502,59502,59503,59503,59504,59504,59505,59505,59506,59506,59507,59507,59508,
+59508,59509,59509,59510,59510,59511,59511,59512,59512,59513,59513,59514,59514,
+59515,59515,59516,59516,59517,59517,59518,59518,59519,59519,59520,59520,59521,
+59521,59522,59522,59523,59523,59524,59524,59525,59525,59526,59526,59527,59527,
+59528,59528,59529,59529,59530,59530,59531,59531,59532,59532,59533,59533,59534,
+59534,59535,59535,59536,59536,59537,59537,59538,59538,59539,59539,59540,59540,
+59541,59541,59542,59542,59543,59543,59544,59544,59545,59545,59546,59546,59547,
+59547,59548,59548,59549,59549,59550,59550,59551,59551,59552,59552,59553,59553,
+59554,59554,59555,59555,59556,59556,59557,59557,59558,59558,59559,59559,59560,
+59560,59561,59561,59562,59562,59563,59563,59564,59564,59565,59565,59566,59566,
+59567,59567,59568,59568,59569,59569,59570,59570,59571,59571,59572,59572,59573,
+59573,59574,59574,59575,59575,59576,59576,59577,59577,59578,59578,59579,59579,
+59580,59580,59581,59581,59582,59582,59583,59583,59584,59584,59585,59585,59586,
+59586,59587,59587,59588,59588,59589,59589,59590,59590,59591,59591,59592,59592,
+59593,59593,59594,59594,59595,59595,59596,59596,59597,59597,59598,59598,59599,
+59599,59600,59600,59601,59601,59602,59602,59603,59603,59604,59604,59605,59605,
+59606,59606,59607,59607,59608,59608,59609,59609,59610,59610,59611,59611,59612,
+59612,59613,59613,59614,59614,59615,59615,59616,59616,59617,59617,59618,59618,
+59619,59619,59620,59620,59621,59621,59622,59622,59623,59623,59624,59624,59625,
+59625,59626,59626,59627,59627,59628,59628,59629,59629,59630,59630,59631,59631,
+59632,59632,59633,59633,59634,59634,59635,59635,59636,59636,59637,59637,59638,
+59638,59639,59639,59640,59640,59641,59641,59642,59642,59643,59643,59644,59644,
+59645,59645,59646,59646,59647,59647,59648,59648,59649,59649,59650,59650,59651,
+59651,59652,59652,59653,59653,59654,59654,59655,59655,59656,59656,59657,59657,
+59658,59658,59659,59659,59660,59660,59661,59661,59662,59662,59663,59663,59664,
+59664,59665,59665,59666,59666,59667,59667,59668,59668,59669,59669,59670,59670,
+59671,59671,59671,59672,59672,59673,59673,59674,59674,59675,59675,59676,59676,
+59677,59677,59678,59678,59679,59679,59680,59680,59681,59681,59682,59682,59683,
+59683,59684,59684,59685,59685,59686,59686,59687,59687,59688,59688,59689,59689,
+59690,59690,59691,59691,59692,59692,59693,59693,59694,59694,59695,59695,59696,
+59696,59697,59697,59698,59698,59699,59699,59700,59700,59701,59701,59702,59702,
+59703,59703,59704,59704,59705,59705,59706,59706,59707,59707,59708,59708,59709,
+59709,59710,59710,59711,59711,59712,59712,59713,59713,59714,59714,59715,59715,
+59716,59716,59717,59717,59718,59718,59719,59719,59720,59720,59721,59721,59722,
+59722,59723,59723,59724,59724,59725,59725,59726,59726,59727,59727,59728,59728,
+59729,59729,59730,59730,59731,59731,59732,59732,59733,59733,59734,59734,59735,
+59735,59736,59736,59737,59737,59738,59738,59739,59739,59740,59740,59741,59741,
+59742,59742,59743,59743,59744,59744,59745,59745,59746,59746,59747,59747,59748,
+59748,59749,59749,59750,59750,59751,59751,59752,59752,59753,59753,59754,59754,
+59755,59755,59756,59756,59757,59757,59758,59758,59759,59759,59759,59760,59760,
+59761,59761,59762,59762,59763,59763,59764,59764,59765,59765,59766,59766,59767,
+59767,59768,59768,59769,59769,59770,59770,59771,59771,59772,59772,59773,59773,
+59774,59774,59775,59775,59776,59776,59777,59777,59778,59778,59779,59779,59780,
+59780,59781,59781,59782,59782,59783,59783,59784,59784,59785,59785,59786,59786,
+59787,59787,59788,59788,59789,59789,59790,59790,59791,59791,59792,59792,59793,
+59793,59794,59794,59795,59795,59796,59796,59797,59797,59798,59798,59799,59799,
+59800,59800,59801,59801,59802,59802,59803,59803,59804,59804,59805,59805,59806,
+59806,59807,59807,59808,59808,59809,59809,59810,59810,59811,59811,59812,59812,
+59813,59813,59814,59814,59815,59815,59816,59816,59817,59817,59818,59818,59819,
+59819,59820,59820,59821,59821,59822,59822,59823,59823,59824,59824,59825,59825,
+59826,59826,59826,59827,59827,59828,59828,59829,59829,59830,59830,59831,59831,
+59832,59832,59833,59833,59834,59834,59835,59835,59836,59836,59837,59837,59838,
+59838,59839,59839,59840,59840,59841,59841,59842,59842,59843,59843,59844,59844,
+59845,59845,59846,59846,59847,59847,59848,59848,59849,59849,59850,59850,59851,
+59851,59852,59852,59853,59853,59854,59854,59855,59855,59856,59856,59857,59857,
+59858,59858,59859,59859,59860,59860,59861,59861,59862,59862,59863,59863,59864,
+59864,59865,59865,59866,59866,59867,59867,59868,59868,59869,59869,59870,59870,
+59871,59871,59872,59872,59873,59873,59874,59874,59875,59875,59876,59876,59877,
+59877,59878,59878,59879,59879,59880,59880,59881,59881,59882,59882,59883,59883,
+59883,59884,59884,59885,59885,59886,59886,59887,59887,59888,59888,59889,59889,
+59890,59890,59891,59891,59892,59892,59893,59893,59894,59894,59895,59895,59896,
+59896,59897,59897,59898,59898,59899,59899,59900,59900,59901,59901,59902,59902,
+59903,59903,59904,59904,59905,59905,59906,59906,59907,59907,59908,59908,59909,
+59909,59910,59910,59911,59911,59912,59912,59913,59913,59914,59914,59915,59915,
+59916,59916,59917,59917,59918,59918,59919,59919,59920,59920,59921,59921,59922,
+59922,59923,59923,59924,59924,59925,59925,59926,59926,59927,59927,59928,59928,
+59929,59929,59930,59930,59931,59931,59932,59932,59933,59933,59933,59934,59934,
+59935,59935,59936,59936,59937,59937,59938,59938,59939,59939,59940,59940,59941,
+59941,59942,59942,59943,59943,59944,59944,59945,59945,59946,59946,59947,59947,
+59948,59948,59949,59949,59950,59950,59951,59951,59952,59952,59953,59953,59954,
+59954,59955,59955,59956,59956,59957,59957,59958,59958,59959,59959,59960,59960,
+59961,59961,59962,59962,59963,59963,59964,59964,59965,59965,59966,59966,59967,
+59967,59968,59968,59969,59969,59970,59970,59971,59971,59972,59972,59973,59973,
+59974,59974,59975,59975,59976,59976,59977,59977,59978,59978,59978,59979,59979,
+59980,59980,59981,59981,59982,59982,59983,59983,59984,59984,59985,59985,59986,
+59986,59987,59987,59988,59988,59989,59989,59990,59990,59991,59991,59992,59992,
+59993,59993,59994,59994,59995,59995,59996,59996,59997,59997,59998,59998,59999,
+59999,60000,60000,60001,60001,60002,60002,60003,60003,60004,60004,60005,60005,
+60006,60006,60007,60007,60008,60008,60009,60009,60010,60010,60011,60011,60012,
+60012,60013,60013,60014,60014,60015,60015,60016,60016,60017,60017,60018,60018,
+60019,60019,60020,60020,60020,60021,60021,60022,60022,60023,60023,60024,60024,
+60025,60025,60026,60026,60027,60027,60028,60028,60029,60029,60030,60030,60031,
+60031,60032,60032,60033,60033,60034,60034,60035,60035,60036,60036,60037,60037,
+60038,60038,60039,60039,60040,60040,60041,60041,60042,60042,60043,60043,60044,
+60044,60045,60045,60046,60046,60047,60047,60048,60048,60049,60049,60050,60050,
+60051,60051,60052,60052,60053,60053,60054,60054,60055,60055,60056,60056,60057,
+60057,60058,60058,60059,60059,60059,60060,60060,60061,60061,60062,60062,60063,
+60063,60064,60064,60065,60065,60066,60066,60067,60067,60068,60068,60069,60069,
+60070,60070,60071,60071,60072,60072,60073,60073,60074,60074,60075,60075,60076,
+60076,60077,60077,60078,60078,60079,60079,60080,60080,60081,60081,60082,60082,
+60083,60083,60084,60084,60085,60085,60086,60086,60087,60087,60088,60088,60089,
+60089,60090,60090,60091,60091,60092,60092,60093,60093,60094,60094,60095,60095,
+60095,60096,60096,60097,60097,60098,60098,60099,60099,60100,60100,60101,60101,
+60102,60102,60103,60103,60104,60104,60105,60105,60106,60106,60107,60107,60108,
+60108,60109,60109,60110,60110,60111,60111,60112,60112,60113,60113,60114,60114,
+60115,60115,60116,60116,60117,60117,60118,60118,60119,60119,60120,60120,60121,
+60121,60122,60122,60123,60123,60124,60124,60125,60125,60126,60126,60127,60127,
+60128,60128,60129,60129,60129,60130,60130,60131,60131,60132,60132,60133,60133,
+60134,60134,60135,60135,60136,60136,60137,60137,60138,60138,60139,60139,60140,
+60140,60141,60141,60142,60142,60143,60143,60144,60144,60145,60145,60146,60146,
+60147,60147,60148,60148,60149,60149,60150,60150,60151,60151,60152,60152,60153,
+60153,60154,60154,60155,60155,60156,60156,60157,60157,60158,60158,60159,60159,
+60160,60160,60161,60161,60162,60162,60162,60163,60163,60164,60164,60165,60165,
+60166,60166,60167,60167,60168,60168,60169,60169,60170,60170,60171,60171,60172,
+60172,60173,60173,60174,60174,60175,60175,60176,60176,60177,60177,60178,60178,
+60179,60179,60180,60180,60181,60181,60182,60182,60183,60183,60184,60184,60185,
+60185,60186,60186,60187,60187,60188,60188,60189,60189,60190,60190,60191,60191,
+60192,60192,60193,60193,60193,60194,60194,60195,60195,60196,60196,60197,60197,
+60198,60198,60199,60199,60200,60200,60201,60201,60202,60202,60203,60203,60204,
+60204,60205,60205,60206,60206,60207,60207,60208,60208,60209,60209,60210,60210,
+60211,60211,60212,60212,60213,60213,60214,60214,60215,60215,60216,60216,60217,
+60217,60218,60218,60219,60219,60220,60220,60221,60221,60222,60222,60223,60223,
+60223,60224,60224,60225,60225,60226,60226,60227,60227,60228,60228,60229,60229,
+60230,60230,60231,60231,60232,60232,60233,60233,60234,60234,60235,60235,60236,
+60236,60237,60237,60238,60238,60239,60239,60240,60240,60241,60241,60242,60242,
+60243,60243,60244,60244,60245,60245,60246,60246,60247,60247,60248,60248,60249,
+60249,60250,60250,60251,60251,60252,60252,60252,60253,60253,60254,60254,60255,
+60255,60256,60256,60257,60257,60258,60258,60259,60259,60260,60260,60261,60261,
+60262,60262,60263,60263,60264,60264,60265,60265,60266,60266,60267,60267,60268,
+60268,60269,60269,60270,60270,60271,60271,60272,60272,60273,60273,60274,60274,
+60275,60275,60276,60276,60277,60277,60278,60278,60279,60279,60280,60280,60280,
+60281,60281,60282,60282,60283,60283,60284,60284,60285,60285,60286,60286,60287,
+60287,60288,60288,60289,60289,60290,60290,60291,60291,60292,60292,60293,60293,
+60294,60294,60295,60295,60296,60296,60297,60297,60298,60298,60299,60299,60300,
+60300,60301,60301,60302,60302,60303,60303,60304,60304,60305,60305,60306,60306,
+60307,60307,60307,60308,60308,60309,60309,60310,60310,60311,60311,60312,60312,
+60313,60313,60314,60314,60315,60315,60316,60316,60317,60317,60318,60318,60319,
+60319,60320,60320,60321,60321,60322,60322,60323,60323,60324,60324,60325,60325,
+60326,60326,60327,60327,60328,60328,60329,60329,60330,60330,60331,60331,60332,
+60332,60333,60333,60333,60334,60334,60335,60335,60336,60336,60337,60337,60338,
+60338,60339,60339,60340,60340,60341,60341,60342,60342,60343,60343,60344,60344,
+60345,60345,60346,60346,60347,60347,60348,60348,60349,60349,60350,60350,60351,
+60351,60352,60352,60353,60353,60354,60354,60355,60355,60356,60356,60357,60357,
+60358,60358,60358,60359,60359,60360,60360,60361,60361,60362,60362,60363,60363,
+60364,60364,60365,60365,60366,60366,60367,60367,60368,60368,60369,60369,60370,
+60370,60371,60371,60372,60372,60373,60373,60374,60374,60375,60375,60376,60376,
+60377,60377,60378,60378,60379,60379,60380,60380,60381,60381,60382,60382,60383,
+60383,60383,60384,60384,60385,60385,60386,60386,60387,60387,60388,60388,60389,
+60389,60390,60390,60391,60391,60392,60392,60393,60393,60394,60394,60395,60395,
+60396,60396,60397,60397,60398,60398,60399,60399,60400,60400,60401,60401,60402,
+60402,60403,60403,60404,60404,60405,60405,60406,60406,60407,60407,60407,60408,
+60408,60409,60409,60410,60410,60411,60411,60412,60412,60413,60413,60414,60414,
+60415,60415,60416,60416,60417,60417,60418,60418,60419,60419,60420,60420,60421,
+60421,60422,60422,60423,60423,60424,60424,60425,60425,60426,60426,60427,60427,
+60428,60428,60429,60429,60430,60430,60430,60431,60431,60432,60432,60433,60433,
+60434,60434,60435,60435,60436,60436,60437,60437,60438,60438,60439,60439,60440,
+60440,60441,60441,60442,60442,60443,60443,60444,60444,60445,60445,60446,60446,
+60447,60447,60448,60448,60449,60449,60450,60450,60451,60451,60452,60452,60453,
+60453,60453,60454,60454,60455,60455,60456,60456,60457,60457,60458,60458,60459,
+60459,60460,60460,60461,60461,60462,60462,60463,60463,60464,60464,60465,60465,
+60466,60466,60467,60467,60468,60468,60469,60469,60470,60470,60471,60471,60472,
+60472,60473,60473,60474,60474,60475,60475,60476,60476,60476,60477,60477,60478,
+60478,60479,60479,60480,60480,60481,60481,60482,60482,60483,60483,60484,60484,
+60485,60485,60486,60486,60487,60487,60488,60488,60489,60489,60490,60490,60491,
+60491,60492,60492,60493,60493,60494,60494,60495,60495,60496,60496,60497,60497,
+60497,60498,60498,60499,60499,60500,60500,60501,60501,60502,60502,60503,60503,
+60504,60504,60505,60505,60506,60506,60507,60507,60508,60508,60509,60509,60510,
+60510,60511,60511,60512,60512,60513,60513,60514,60514,60515,60515,60516,60516,
+60517,60517,60518,60518,60519,60519,60519,60520,60520,60521,60521,60522,60522,
+60523,60523,60524,60524,60525,60525,60526,60526,60527,60527,60528,60528,60529,
+60529,60530,60530,60531,60531,60532,60532,60533,60533,60534,60534,60535,60535,
+60536,60536,60537,60537,60538,60538,60539,60539,60540,60540,60540,60541,60541,
+60542,60542,60543,60543,60544,60544,60545,60545,60546,60546,60547,60547,60548,
+60548,60549,60549,60550,60550,60551,60551,60552,60552,60553,60553,60554,60554,
+60555,60555,60556,60556,60557,60557,60558,60558,60559,60559,60560,60560,60560,
+60561,60561,60562,60562,60563,60563,60564,60564,60565,60565,60566,60566,60567,
+60567,60568,60568,60569,60569,60570,60570,60571,60571,60572,60572,60573,60573,
+60574,60574,60575,60575,60576,60576,60577,60577,60578,60578,60579,60579,60580,
+60580,60580,60581,60581,60582,60582,60583,60583,60584,60584,60585,60585,60586,
+60586,60587,60587,60588,60588,60589,60589,60590,60590,60591,60591,60592,60592,
+60593,60593,60594,60594,60595,60595,60596,60596,60597,60597,60598,60598,60599,
+60599,60600,60600,60600,60601,60601,60602,60602,60603,60603,60604,60604,60605,
+60605,60606,60606,60607,60607,60608,60608,60609,60609,60610,60610,60611,60611,
+60612,60612,60613,60613,60614,60614,60615,60615,60616,60616,60617,60617,60618,
+60618,60619,60619,60620,60620,60620,60621,60621,60622,60622,60623,60623,60624,
+60624,60625,60625,60626,60626,60627,60627,60628,60628,60629,60629,60630,60630,
+60631,60631,60632,60632,60633,60633,60634,60634,60635,60635,60636,60636,60637,
+60637,60638,60638,60639,60639,60639,60640,60640,60641,60641,60642,60642,60643,
+60643,60644,60644,60645,60645,60646,60646,60647,60647,60648,60648,60649,60649,
+60650,60650,60651,60651,60652,60652,60653,60653,60654,60654,60655,60655,60656,
+60656,60657,60657,60658,60658,60658,60659,60659,60660,60660,60661,60661,60662,
+60662,60663,60663,60664,60664,60665,60665,60666,60666,60667,60667,60668,60668,
+60669,60669,60670,60670,60671,60671,60672,60672,60673,60673,60674,60674,60675,
+60675,60676,60676,60676,60677,60677,60678,60678,60679,60679,60680,60680,60681,
+60681,60682,60682,60683,60683,60684,60684,60685,60685,60686,60686,60687,60687,
+60688,60688,60689,60689,60690,60690,60691,60691,60692,60692,60693,60693,60694,
+60694,60695,60695,60695,60696,60696,60697,60697,60698,60698,60699,60699,60700,
+60700,60701,60701,60702,60702,60703,60703,60704,60704,60705,60705,60706,60706,
+60707,60707,60708,60708,60709,60709,60710,60710,60711,60711,60712,60712,60713,
+60713,60713,60714,60714,60715,60715,60716,60716,60717,60717,60718,60718,60719,
+60719,60720,60720,60721,60721,60722,60722,60723,60723,60724,60724,60725,60725,
+60726,60726,60727,60727,60728,60728,60729,60729,60730,60730,60730,60731,60731,
+60732,60732,60733,60733,60734,60734,60735,60735,60736,60736,60737,60737,60738,
+60738,60739,60739,60740,60740,60741,60741,60742,60742,60743,60743,60744,60744,
+60745,60745,60746,60746,60747,60747,60748,60748,60748,60749,60749,60750,60750,
+60751,60751,60752,60752,60753,60753,60754,60754,60755,60755,60756,60756,60757,
+60757,60758,60758,60759,60759,60760,60760,60761,60761,60762,60762,60763,60763,
+60764,60764,60765,60765,60765,60766,60766,60767,60767,60768,60768,60769,60769,
+60770,60770,60771,60771,60772,60772,60773,60773,60774,60774,60775,60775,60776,
+60776,60777,60777,60778,60778,60779,60779,60780,60780,60781,60781,60782,60782,
+60782,60783,60783,60784,60784,60785,60785,60786,60786,60787,60787,60788,60788,
+60789,60789,60790,60790,60791,60791,60792,60792,60793,60793,60794,60794,60795,
+60795,60796,60796,60797,60797,60798,60798,60799,60799,60799,60800,60800,60801,
+60801,60802,60802,60803,60803,60804,60804,60805,60805,60806,60806,60807,60807,
+60808,60808,60809,60809,60810,60810,60811,60811,60812,60812,60813,60813,60814,
+60814,60815,60815,60816,60816,60816,60817,60817,60818,60818,60819,60819,60820,
+60820,60821,60821,60822,60822,60823,60823,60824,60824,60825,60825,60826,60826,
+60827,60827,60828,60828,60829,60829,60830,60830,60831,60831,60832,60832,60832,
+60833,60833,60834,60834,60835,60835,60836,60836,60837,60837,60838,60838,60839,
+60839,60840,60840,60841,60841,60842,60842,60843,60843,60844,60844,60845,60845,
+60846,60846,60847,60847,60848,60848,60848,60849,60849,60850,60850,60851,60851,
+60852,60852,60853,60853,60854,60854,60855,60855,60856,60856,60857,60857,60858,
+60858,60859,60859,60860,60860,60861,60861,60862,60862,60863,60863,60864,60864,
+60864,60865,60865,60866,60866,60867,60867,60868,60868,60869,60869,60870,60870,
+60871,60871,60872,60872,60873,60873,60874,60874,60875,60875,60876,60876,60877,
+60877,60878,60878,60879,60879,60880,60880,60880,60881,60881,60882,60882,60883,
+60883,60884,60884,60885,60885,60886,60886,60887,60887,60888,60888,60889,60889,
+60890,60890,60891,60891,60892,60892,60893,60893,60894,60894,60895,60895,60896,
+60896,60896,60897,60897,60898,60898,60899,60899,60900,60900,60901,60901,60902,
+60902,60903,60903,60904,60904,60905,60905,60906,60906,60907,60907,60908,60908,
+60909,60909,60910,60910,60911,60911,60911,60912,60912,60913,60913,60914,60914,
+60915,60915,60916,60916,60917,60917,60918,60918,60919,60919,60920,60920,60921,
+60921,60922,60922,60923,60923,60924,60924,60925,60925,60926,60926,60927,60927,
+60927,60928,60928,60929,60929,60930,60930,60931,60931,60932,60932,60933,60933,
+60934,60934,60935,60935,60936,60936,60937,60937,60938,60938,60939,60939,60940,
+60940,60941,60941,60942,60942,60942,60943,60943,60944,60944,60945,60945,60946,
+60946,60947,60947,60948,60948,60949,60949,60950,60950,60951,60951,60952,60952,
+60953,60953,60954,60954,60955,60955,60956,60956,60957,60957,60957,60958,60958,
+60959,60959,60960,60960,60961,60961,60962,60962,60963,60963,60964,60964,60965,
+60965,60966,60966,60967,60967,60968,60968,60969,60969,60970,60970,60971,60971,
+60972,60972,60972,60973,60973,60974,60974,60975,60975,60976,60976,60977,60977,
+60978,60978,60979,60979,60980,60980,60981,60981,60982,60982,60983,60983,60984,
+60984,60985,60985,60986,60986,60987,60987,60987,60988,60988,60989,60989,60990,
+60990,60991,60991,60992,60992,60993,60993,60994,60994,60995,60995,60996,60996,
+60997,60997,60998,60998,60999,60999,61000,61000,61001,61001,61001,61002,61002,
+61003,61003,61004,61004,61005,61005,61006,61006,61007,61007,61008,61008,61009,
+61009,61010,61010,61011,61011,61012,61012,61013,61013,61014,61014,61015,61015,
+61016,61016,61016,61017,61017,61018,61018,61019,61019,61020,61020,61021,61021,
+61022,61022,61023,61023,61024,61024,61025,61025,61026,61026,61027,61027,61028,
+61028,61029,61029,61030,61030,61030,61031,61031,61032,61032,61033,61033,61034,
+61034,61035,61035,61036,61036,61037,61037,61038,61038,61039,61039,61040,61040,
+61041,61041,61042,61042,61043,61043,61044,61044,61044,61045,61045,61046,61046,
+61047,61047,61048,61048,61049,61049,61050,61050,61051,61051,61052,61052,61053,
+61053,61054,61054,61055,61055,61056,61056,61057,61057,61058,61058,61058,61059,
+61059,61060,61060,61061,61061,61062,61062,61063,61063,61064,61064,61065,61065,
+61066,61066,61067,61067,61068,61068,61069,61069,61070,61070,61071,61071,61072,
+61072,61072,61073,61073,61074,61074,61075,61075,61076,61076,61077,61077,61078,
+61078,61079,61079,61080,61080,61081,61081,61082,61082,61083,61083,61084,61084,
+61085,61085,61086,61086,61086,61087,61087,61088,61088,61089,61089,61090,61090,
+61091,61091,61092,61092,61093,61093,61094,61094,61095,61095,61096,61096,61097,
+61097,61098,61098,61099,61099,61100,61100,61100,61101,61101,61102,61102,61103,
+61103,61104,61104,61105,61105,61106,61106,61107,61107,61108,61108,61109,61109,
+61110,61110,61111,61111,61112,61112,61113,61113,61113,61114,61114,61115,61115,
+61116,61116,61117,61117,61118,61118,61119,61119,61120,61120,61121,61121,61122,
+61122,61123,61123,61124,61124,61125,61125,61126,61126,61127,61127,61127,61128,
+61128,61129,61129,61130,61130,61131,61131,61132,61132,61133,61133,61134,61134,
+61135,61135,61136,61136,61137,61137,61138,61138,61139,61139,61140,61140,61140,
+61141,61141,61142,61142,61143,61143,61144,61144,61145,61145,61146,61146,61147,
+61147,61148,61148,61149,61149,61150,61150,61151,61151,61152,61152,61153,61153,
+61154,61154,61154,61155,61155,61156,61156,61157,61157,61158,61158,61159,61159,
+61160,61160,61161,61161,61162,61162,61163,61163,61164,61164,61165,61165,61166,
+61166,61167,61167,61167,61168,61168,61169,61169,61170,61170,61171,61171,61172,
+61172,61173,61173,61174,61174,61175,61175,61176,61176,61177,61177,61178,61178,
+61179,61179,61180,61180,61180,61181,61181,61182,61182,61183,61183,61184,61184,
+61185,61185,61186,61186,61187,61187,61188,61188,61189,61189,61190,61190,61191,
+61191,61192,61192,61193,61193,61193,61194,61194,61195,61195,61196,61196,61197,
+61197,61198,61198,61199,61199,61200,61200,61201,61201,61202,61202,61203,61203,
+61204,61204,61205,61205,61206,61206,61206,61207,61207,61208,61208,61209,61209,
+61210,61210,61211,61211,61212,61212,61213,61213,61214,61214,61215,61215,61216,
+61216,61217,61217,61218,61218,61218,61219,61219,61220,61220,61221,61221,61222,
+61222,61223,61223,61224,61224,61225,61225,61226,61226,61227,61227,61228,61228,
+61229,61229,61230,61230,61231,61231,61231,61232,61232,61233,61233,61234,61234,
+61235,61235,61236,61236,61237,61237,61238,61238,61239,61239,61240,61240,61241,
+61241,61242,61242,61243,61243,61244,61244,61244,61245,61245,61246,61246,61247,
+61247,61248,61248,61249,61249,61250,61250,61251,61251,61252,61252,61253,61253,
+61254,61254,61255,61255,61256,61256,61256,61257,61257,61258,61258,61259,61259,
+61260,61260,61261,61261,61262,61262,61263,61263,61264,61264,61265,61265,61266,
+61266,61267,61267,61268,61268,61269,61269,61269,61270,61270,61271,61271,61272,
+61272,61273,61273,61274,61274,61275,61275,61276,61276,61277,61277,61278,61278,
+61279,61279,61280,61280,61281,61281,61281,61282,61282,61283,61283,61284,61284,
+61285,61285,61286,61286,61287,61287,61288,61288,61289,61289,61290,61290,61291,
+61291,61292,61292,61293,61293,61293,61294,61294,61295,61295,61296,61296,61297,
+61297,61298,61298,61299,61299,61300,61300,61301,61301,61302,61302,61303,61303,
+61304,61304,61305,61305,61305,61306,61306,61307,61307,61308,61308,61309,61309,
+61310,61310,61311,61311,61312,61312,61313,61313,61314,61314,61315,61315,61316,
+61316,61317,61317,61317,61318,61318,61319,61319,61320,61320,61321,61321,61322,
+61322,61323,61323,61324,61324,61325,61325,61326,61326,61327,61327,61328,61328,
+61329,61329,61329,61330,61330,61331,61331,61332,61332,61333,61333,61334,61334,
+61335,61335,61336,61336,61337,61337,61338,61338,61339,61339,61340,61340,61341,
+61341,61341,61342,61342,61343,61343,61344,61344,61345,61345,61346,61346,61347,
+61347,61348,61348,61349,61349,61350,61350,61351,61351,61352,61352,61353,61353,
+61353,61354,61354,61355,61355,61356,61356,61357,61357,61358,61358,61359,61359,
+61360,61360,61361,61361,61362,61362,61363,61363,61364,61364,61365,61365,61365,
+61366,61366,61367,61367,61368,61368,61369,61369,61370,61370,61371,61371,61372,
+61372,61373,61373,61374,61374,61375,61375,61376,61376,61377,61377,61377,61378,
+61378,61379,61379,61380,61380,61381,61381,61382,61382,61383,61383,61384,61384,
+61385,61385,61386,61386,61387,61387,61388,61388,61388,61389,61389,61390,61390,
+61391,61391,61392,61392,61393,61393,61394,61394,61395,61395,61396,61396,61397,
+61397,61398,61398,61399,61399,61400,61400,61400,61401,61401,61402,61402,61403,
+61403,61404,61404,61405,61405,61406,61406,61407,61407,61408,61408,61409,61409,
+61410,61410,61411,61411,61411,61412,61412,61413,61413,61414,61414,61415,61415,
+61416,61416,61417,61417,61418,61418,61419,61419,61420,61420,61421,61421,61422,
+61422,61423,61423,61423,61424,61424,61425,61425,61426,61426,61427,61427,61428,
+61428,61429,61429,61430,61430,61431,61431,61432,61432,61433,61433,61434,61434,
+61434,61435,61435,61436,61436,61437,61437,61438,61438,61439,61439,61440,61440,
+61441,61441,61442,61442,61443,61443,61444,61444,61445,61445,61445,61446,61446,
+61447,61447,61448,61448,61449,61449,61450,61450,61451,61451,61452,61452,61453,
+61453,61454,61454,61455,61455,61456,61456,61457,61457,61457,61458,61458,61459,
+61459,61460,61460,61461,61461,61462,61462,61463,61463,61464,61464,61465,61465,
+61466,61466,61467,61467,61468,61468,61468,61469,61469,61470,61470,61471,61471,
+61472,61472,61473,61473,61474,61474,61475,61475,61476,61476,61477,61477,61478,
+61478,61479,61479,61479,61480,61480,61481,61481,61482,61482,61483,61483,61484,
+61484,61485,61485,61486,61486,61487,61487,61488,61488,61489,61489,61490,61490,
+61490,61491,61491,61492,61492,61493,61493,61494,61494,61495,61495,61496,61496,
+61497,61497,61498,61498,61499,61499,61500,61500,61501,61501,61501,61502,61502,
+61503,61503,61504,61504,61505,61505,61506,61506,61507,61507,61508,61508,61509,
+61509,61510,61510,61511,61511,61512,61512,61512,61513,61513,61514,61514,61515,
+61515,61516,61516,61517,61517,61518,61518,61519,61519,61520,61520,61521,61521,
+61522,61522,61523,61523,61523,61524,61524,61525,61525,61526,61526,61527,61527,
+61528,61528,61529,61529,61530,61530,61531,61531,61532,61532,61533,61533,61534,
+61534,61534,61535,61535,61536,61536,61537,61537,61538,61538,61539,61539,61540,
+61540,61541,61541,61542,61542,61543,61543,61544,61544,61544,61545,61545,61546,
+61546,61547,61547,61548,61548,61549,61549,61550,61550,61551,61551,61552,61552,
+61553,61553,61554,61554,61555,61555,61555,61556,61556,61557,61557,61558,61558,
+61559,61559,61560,61560,61561,61561,61562,61562,61563,61563,61564,61564,61565,
+61565,61566,61566,61566,61567,61567,61568,61568,61569,61569,61570,61570,61571,
+61571,61572,61572,61573,61573,61574,61574,61575,61575,61576,61576,61576,61577,
+61577,61578,61578,61579,61579,61580,61580,61581,61581,61582,61582,61583,61583,
+61584,61584,61585,61585,61586,61586,61587,61587,61587,61588,61588,61589,61589,
+61590,61590,61591,61591,61592,61592,61593,61593,61594,61594,61595,61595,61596,
+61596,61597,61597,61597,61598,61598,61599,61599,61600,61600,61601,61601,61602,
+61602,61603,61603,61604,61604,61605,61605,61606,61606,61607,61607,61608,61608,
+61608,61609,61609,61610,61610,61611,61611,61612,61612,61613,61613,61614,61614,
+61615,61615,61616,61616,61617,61617,61618,61618,61618,61619,61619,61620,61620,
+61621,61621,61622,61622,61623,61623,61624,61624,61625,61625,61626,61626,61627,
+61627,61628,61628,61628,61629,61629,61630,61630,61631,61631,61632,61632,61633,
+61633,61634,61634,61635,61635,61636,61636,61637,61637,61638,61638,61639,61639,
+61639,61640,61640,61641,61641,61642,61642,61643,61643,61644,61644,61645,61645,
+61646,61646,61647,61647,61648,61648,61649,61649,61649,61650,61650,61651,61651,
+61652,61652,61653,61653,61654,61654,61655,61655,61656,61656,61657,61657,61658,
+61658,61659,61659,61659,61660,61660,61661,61661,61662,61662,61663,61663,61664,
+61664,61665,61665,61666,61666,61667,61667,61668,61668,61669,61669,61669,61670,
+61670,61671,61671,61672,61672,61673,61673,61674,61674,61675,61675,61676,61676,
+61677,61677,61678,61678,61679,61679,61679,61680,61680,61681,61681,61682,61682,
+61683,61683,61684,61684,61685,61685,61686,61686,61687,61687,61688,61688,61689,
+61689,61689,61690,61690,61691,61691,61692,61692,61693,61693,61694,61694,61695,
+61695,61696,61696,61697,61697,61698,61698,61699,61699,61699,61700,61700,61701,
+61701,61702,61702,61703,61703,61704,61704,61705,61705,61706,61706,61707,61707,
+61708,61708,61709,61709,61709,61710,61710,61711,61711,61712,61712,61713,61713,
+61714,61714,61715,61715,61716,61716,61717,61717,61718,61718,61719,61719,61719,
+61720,61720,61721,61721,61722,61722,61723,61723,61724,61724,61725,61725,61726,
+61726,61727,61727,61728,61728,61729,61729,61729,61730,61730,61731,61731,61732,
+61732,61733,61733,61734,61734,61735,61735,61736,61736,61737,61737,61738,61738,
+61739,61739,61739,61740,61740,61741,61741,61742,61742,61743,61743,61744,61744,
+61745,61745,61746,61746,61747,61747,61748,61748,61749,61749,61749,61750,61750,
+61751,61751,61752,61752,61753,61753,61754,61754,61755,61755,61756,61756,61757,
+61757,61758,61758,61759,61759,61759,61760,61760,61761,61761,61762,61762,61763,
+61763,61764,61764,61765,61765,61766,61766,61767,61767,61768,61768,61768,61769,
+61769,61770,61770,61771,61771,61772,61772,61773,61773,61774,61774,61775,61775,
+61776,61776,61777,61777,61778,61778,61778,61779,61779,61780,61780,61781,61781,
+61782,61782,61783,61783,61784,61784,61785,61785,61786,61786,61787,61787,61788,
+61788,61788,61789,61789,61790,61790,61791,61791,61792,61792,61793,61793,61794,
+61794,61795,61795,61796,61796,61797,61797,61797,61798,61798,61799,61799,61800,
+61800,61801,61801,61802,61802,61803,61803,61804,61804,61805,61805,61806,61806,
+61807,61807,61807,61808,61808,61809,61809,61810,61810,61811,61811,61812,61812,
+61813,61813,61814,61814,61815,61815,61816,61816,61816,61817,61817,61818,61818,
+61819,61819,61820,61820,61821,61821,61822,61822,61823,61823,61824,61824,61825,
+61825,61826,61826,61826,61827,61827,61828,61828,61829,61829,61830,61830,61831,
+61831,61832,61832,61833,61833,61834,61834,61835,61835,61835,61836,61836,61837,
+61837,61838,61838,61839,61839,61840,61840,61841,61841,61842,61842,61843,61843,
+61844,61844,61844,61845,61845,61846,61846,61847,61847,61848,61848,61849,61849,
+61850,61850,61851,61851,61852,61852,61853,61853,61854,61854,61854,61855,61855,
+61856,61856,61857,61857,61858,61858,61859,61859,61860,61860,61861,61861,61862,
+61862,61863,61863,61863,61864,61864,61865,61865,61866,61866,61867,61867,61868,
+61868,61869,61869,61870,61870,61871,61871,61872,61872,61872,61873,61873,61874,
+61874,61875,61875,61876,61876,61877,61877,61878,61878,61879,61879,61880,61880,
+61881,61881,61882,61882,61882,61883,61883,61884,61884,61885,61885,61886,61886,
+61887,61887,61888,61888,61889,61889,61890,61890,61891,61891,61891,61892,61892,
+61893,61893,61894,61894,61895,61895,61896,61896,61897,61897,61898,61898,61899,
+61899,61900,61900,61900,61901,61901,61902,61902,61903,61903,61904,61904,61905,
+61905,61906,61906,61907,61907,61908,61908,61909,61909,61909,61910,61910,61911,
+61911,61912,61912,61913,61913,61914,61914,61915,61915,61916,61916,61917,61917,
+61918,61918,61918,61919,61919,61920,61920,61921,61921,61922,61922,61923,61923,
+61924,61924,61925,61925,61926,61926,61927,61927,61927,61928,61928,61929,61929,
+61930,61930,61931,61931,61932,61932,61933,61933,61934,61934,61935,61935,61936,
+61936,61936,61937,61937,61938,61938,61939,61939,61940,61940,61941,61941,61942,
+61942,61943,61943,61944,61944,61945,61945,61945,61946,61946,61947,61947,61948,
+61948,61949,61949,61950,61950,61951,61951,61952,61952,61953,61953,61954,61954,
+61954,61955,61955,61956,61956,61957,61957,61958,61958,61959,61959,61960,61960,
+61961,61961,61962,61962,61963,61963,61963,61964,61964,61965,61965,61966,61966,
+61967,61967,61968,61968,61969,61969,61970,61970,61971,61971,61972,61972,61972,
+61973,61973,61974,61974,61975,61975,61976,61976,61977,61977,61978,61978,61979,
+61979,61980,61980,61981,61981,61981,61982,61982,61983,61983,61984,61984,61985,
+61985,61986,61986,61987,61987,61988,61988,61989,61989,61990,61990,61990,61991,
+61991,61992,61992,61993,61993,61994,61994,61995,61995,61996,61996,61997,61997,
+61998,61998,61999,61999,61999,62000,62000,62001,62001,62002,62002,62003,62003,
+62004,62004,62005,62005,62006,62006,62007,62007,62007,62008,62008,62009,62009,
+62010,62010,62011,62011,62012,62012,62013,62013,62014,62014,62015,62015,62016,
+62016,62016,62017,62017,62018,62018,62019,62019,62020,62020,62021,62021,62022,
+62022,62023,62023,62024,62024,62025,62025,62025,62026,62026,62027,62027,62028,
+62028,62029,62029,62030,62030,62031,62031,62032,62032,62033,62033,62034,62034,
+62034,62035,62035,62036,62036,62037,62037,62038,62038,62039,62039,62040,62040,
+62041,62041,62042,62042,62042,62043,62043,62044,62044,62045,62045,62046,62046,
+62047,62047,62048,62048,62049,62049,62050,62050,62051,62051,62051,62052,62052,
+62053,62053,62054,62054,62055,62055,62056,62056,62057,62057,62058,62058,62059,
+62059,62060,62060,62060,62061,62061,62062,62062,62063,62063,62064,62064,62065,
+62065,62066,62066,62067,62067,62068,62068,62068,62069,62069,62070,62070,62071,
+62071,62072,62072,62073,62073,62074,62074,62075,62075,62076,62076,62077,62077,
+62077,62078,62078,62079,62079,62080,62080,62081,62081,62082,62082,62083,62083,
+62084,62084,62085,62085,62085,62086,62086,62087,62087,62088,62088,62089,62089,
+62090,62090,62091,62091,62092,62092,62093,62093,62094,62094,62094,62095,62095,
+62096,62096,62097,62097,62098,62098,62099,62099,62100,62100,62101,62101,62102,
+62102,62102,62103,62103,62104,62104,62105,62105,62106,62106,62107,62107,62108,
+62108,62109,62109,62110,62110,62111,62111,62111,62112,62112,62113,62113,62114,
+62114,62115,62115,62116,62116,62117,62117,62118,62118,62119,62119,62119,62120,
+62120,62121,62121,62122,62122,62123,62123,62124,62124,62125,62125,62126,62126,
+62127,62127,62127,62128,62128,62129,62129,62130,62130,62131,62131,62132,62132,
+62133,62133,62134,62134,62135,62135,62136,62136,62136,62137,62137,62138,62138,
+62139,62139,62140,62140,62141,62141,62142,62142,62143,62143,62144,62144,62144,
+62145,62145,62146,62146,62147,62147,62148,62148,62149,62149,62150,62150,62151,
+62151,62152,62152,62152,62153,62153,62154,62154,62155,62155,62156,62156,62157,
+62157,62158,62158,62159,62159,62160,62160,62161,62161,62161,62162,62162,62163,
+62163,62164,62164,62165,62165,62166,62166,62167,62167,62168,62168,62169,62169,
+62169,62170,62170,62171,62171,62172,62172,62173,62173,62174,62174,62175,62175,
+62176,62176,62177,62177,62177,62178,62178,62179,62179,62180,62180,62181,62181,
+62182,62182,62183,62183,62184,62184,62185,62185,62185,62186,62186,62187,62187,
+62188,62188,62189,62189,62190,62190,62191,62191,62192,62192,62193,62193,62193,
+62194,62194,62195,62195,62196,62196,62197,62197,62198,62198,62199,62199,62200,
+62200,62201,62201,62202,62202,62202,62203,62203,62204,62204,62205,62205,62206,
+62206,62207,62207,62208,62208,62209,62209,62210,62210,62210,62211,62211,62212,
+62212,62213,62213,62214,62214,62215,62215,62216,62216,62217,62217,62218,62218,
+62218,62219,62219,62220,62220,62221,62221,62222,62222,62223,62223,62224,62224,
+62225,62225,62226,62226,62226,62227,62227,62228,62228,62229,62229,62230,62230,
+62231,62231,62232,62232,62233,62233,62234,62234,62234,62235,62235,62236,62236,
+62237,62237,62238,62238,62239,62239,62240,62240,62241,62241,62242,62242,62242,
+62243,62243,62244,62244,62245,62245,62246,62246,62247,62247,62248,62248,62249,
+62249,62250,62250,62250,62251,62251,62252,62252,62253,62253,62254,62254,62255,
+62255,62256,62256,62257,62257,62258,62258,62258,62259,62259,62260,62260,62261,
+62261,62262,62262,62263,62263,62264,62264,62265,62265,62266,62266,62266,62267,
+62267,62268,62268,62269,62269,62270,62270,62271,62271,62272,62272,62273,62273,
+62274,62274,62274,62275,62275,62276,62276,62277,62277,62278,62278,62279,62279,
+62280,62280,62281,62281,62282,62282,62282,62283,62283,62284,62284,62285,62285,
+62286,62286,62287,62287,62288,62288,62289,62289,62290,62290,62290,62291,62291,
+62292,62292,62293,62293,62294,62294,62295,62295,62296,62296,62297,62297,62298,
+62298,62298,62299,62299,62300,62300,62301,62301,62302,62302,62303,62303,62304,
+62304,62305,62305,62305,62306,62306,62307,62307,62308,62308,62309,62309,62310,
+62310,62311,62311,62312,62312,62313,62313,62313,62314,62314,62315,62315,62316,
+62316,62317,62317,62318,62318,62319,62319,62320,62320,62321,62321,62321,62322,
+62322,62323,62323,62324,62324,62325,62325,62326,62326,62327,62327,62328,62328,
+62329,62329,62329,62330,62330,62331,62331,62332,62332,62333,62333,62334,62334,
+62335,62335,62336,62336,62337,62337,62337,62338,62338,62339,62339,62340,62340,
+62341,62341,62342,62342,62343,62343,62344,62344,62344,62345,62345,62346,62346,
+62347,62347,62348,62348,62349,62349,62350,62350,62351,62351,62352,62352,62352,
+62353,62353,62354,62354,62355,62355,62356,62356,62357,62357,62358,62358,62359,
+62359,62360,62360,62360,62361,62361,62362,62362,62363,62363,62364,62364,62365,
+62365,62366,62366,62367,62367,62368,62368,62368,62369,62369,62370,62370,62371,
+62371,62372,62372,62373,62373,62374,62374,62375,62375,62375,62376,62376,62377,
+62377,62378,62378,62379,62379,62380,62380,62381,62381,62382,62382,62383,62383,
+62383,62384,62384,62385,62385,62386,62386,62387,62387,62388,62388,62389,62389,
+62390,62390,62390,62391,62391,62392,62392,62393,62393,62394,62394,62395,62395,
+62396,62396,62397,62397,62398,62398,62398,62399,62399,62400,62400,62401,62401,
+62402,62402,62403,62403,62404,62404,62405,62405,62406,62406,62406,62407,62407,
+62408,62408,62409,62409,62410,62410,62411,62411,62412,62412,62413,62413,62413,
+62414,62414,62415,62415,62416,62416,62417,62417,62418,62418,62419,62419,62420,
+62420,62421,62421,62421,62422,62422,62423,62423,62424,62424,62425,62425,62426,
+62426,62427,62427,62428,62428,62428,62429,62429,62430,62430,62431,62431,62432,
+62432,62433,62433,62434,62434,62435,62435,62436,62436,62436,62437,62437,62438,
+62438,62439,62439,62440,62440,62441,62441,62442,62442,62443,62443,62443,62444,
+62444,62445,62445,62446,62446,62447,62447,62448,62448,62449,62449,62450,62450,
+62451,62451,62451,62452,62452,62453,62453,62454,62454,62455,62455,62456,62456,
+62457,62457,62458,62458,62458,62459,62459,62460,62460,62461,62461,62462,62462,
+62463,62463,62464,62464,62465,62465,62466,62466,62466,62467,62467,62468,62468,
+62469,62469,62470,62470,62471,62471,62472,62472,62473,62473,62473,62474,62474,
+62475,62475,62476,62476,62477,62477,62478,62478,62479,62479,62480,62480,62480,
+62481,62481,62482,62482,62483,62483,62484,62484,62485,62485,62486,62486,62487,
+62487,62488,62488,62488,62489,62489,62490,62490,62491,62491,62492,62492,62493,
+62493,62494,62494,62495,62495,62495,62496,62496,62497,62497,62498,62498,62499,
+62499,62500,62500,62501,62501,62502,62502,62502,62503,62503,62504,62504,62505,
+62505,62506,62506,62507,62507,62508,62508,62509,62509,62510,62510,62510,62511,
+62511,62512,62512,62513,62513,62514,62514,62515,62515,62516,62516,62517,62517,
+62517,62518,62518,62519,62519,62520,62520,62521,62521,62522,62522,62523,62523,
+62524,62524,62524,62525,62525,62526,62526,62527,62527,62528,62528,62529,62529,
+62530,62530,62531,62531,62532,62532,62532,62533,62533,62534,62534,62535,62535,
+62536,62536,62537,62537,62538,62538,62539,62539,62539,62540,62540,62541,62541,
+62542,62542,62543,62543,62544,62544,62545,62545,62546,62546,62546,62547,62547,
+62548,62548,62549,62549,62550,62550,62551,62551,62552,62552,62553,62553,62553,
+62554,62554,62555,62555,62556,62556,62557,62557,62558,62558,62559,62559,62560,
+62560,62561,62561,62561,62562,62562,62563,62563,62564,62564,62565,62565,62566,
+62566,62567,62567,62568,62568,62568,62569,62569,62570,62570,62571,62571,62572,
+62572,62573,62573,62574,62574,62575,62575,62575,62576,62576,62577,62577,62578,
+62578,62579,62579,62580,62580,62581,62581,62582,62582,62582,62583,62583,62584,
+62584,62585,62585,62586,62586,62587,62587,62588,62588,62589,62589,62589,62590,
+62590,62591,62591,62592,62592,62593,62593,62594,62594,62595,62595,62596,62596,
+62596,62597,62597,62598,62598,62599,62599,62600,62600,62601,62601,62602,62602,
+62603,62603,62603,62604,62604,62605,62605,62606,62606,62607,62607,62608,62608,
+62609,62609,62610,62610,62610,62611,62611,62612,62612,62613,62613,62614,62614,
+62615,62615,62616,62616,62617,62617,62618,62618,62618,62619,62619,62620,62620,
+62621,62621,62622,62622,62623,62623,62624,62624,62625,62625,62625,62626,62626,
+62627,62627,62628,62628,62629,62629,62630,62630,62631,62631,62632,62632,62632,
+62633,62633,62634,62634,62635,62635,62636,62636,62637,62637,62638,62638,62639,
+62639,62639,62640,62640,62641,62641,62642,62642,62643,62643,62644,62644,62645,
+62645,62646,62646,62646,62647,62647,62648,62648,62649,62649,62650,62650,62651,
+62651,62652,62652,62653,62653,62653,62654,62654,62655,62655,62656,62656,62657,
+62657,62658,62658,62659,62659,62660,62660,62660,62661,62661,62662,62662,62663,
+62663,62664,62664,62665,62665,62666,62666,62667,62667,62667,62668,62668,62669,
+62669,62670,62670,62671,62671,62672,62672,62673,62673,62674,62674,62674,62675,
+62675,62676,62676,62677,62677,62678,62678,62679,62679,62680,62680,62680,62681,
+62681,62682,62682,62683,62683,62684,62684,62685,62685,62686,62686,62687,62687,
+62687,62688,62688,62689,62689,62690,62690,62691,62691,62692,62692,62693,62693,
+62694,62694,62694,62695,62695,62696,62696,62697,62697,62698,62698,62699,62699,
+62700,62700,62701,62701,62701,62702,62702,62703,62703,62704,62704,62705,62705,
+62706,62706,62707,62707,62708,62708,62708,62709,62709,62710,62710,62711,62711,
+62712,62712,62713,62713,62714,62714,62715,62715,62715,62716,62716,62717,62717,
+62718,62718,62719,62719,62720,62720,62721,62721,62722,62722,62722,62723,62723,
+62724,62724,62725,62725,62726,62726,62727,62727,62728,62728,62729,62729,62729,
+62730,62730,62731,62731,62732,62732,62733,62733,62734,62734,62735,62735,62735,
+62736,62736,62737,62737,62738,62738,62739,62739,62740,62740,62741,62741,62742,
+62742,62742,62743,62743,62744,62744,62745,62745,62746,62746,62747,62747,62748,
+62748,62749,62749,62749,62750,62750,62751,62751,62752,62752,62753,62753,62754,
+62754,62755,62755,62756,62756,62756,62757,62757,62758,62758,62759,62759,62760,
+62760,62761,62761,62762,62762,62762,62763,62763,62764,62764,62765,62765,62766,
+62766,62767,62767,62768,62768,62769,62769,62769,62770,62770,62771,62771,62772,
+62772,62773,62773,62774,62774,62775,62775,62776,62776,62776,62777,62777,62778,
+62778,62779,62779,62780,62780,62781,62781,62782,62782,62783,62783,62783,62784,
+62784,62785,62785,62786,62786,62787,62787,62788,62788,62789,62789,62789,62790,
+62790,62791,62791,62792,62792,62793,62793,62794,62794,62795,62795,62796,62796,
+62796,62797,62797,62798,62798,62799,62799,62800,62800,62801,62801,62802,62802,
+62803,62803,62803,62804,62804,62805,62805,62806,62806,62807,62807,62808,62808,
+62809,62809,62809,62810,62810,62811,62811,62812,62812,62813,62813,62814,62814,
+62815,62815,62816,62816,62816,62817,62817,62818,62818,62819,62819,62820,62820,
+62821,62821,62822,62822,62823,62823,62823,62824,62824,62825,62825,62826,62826,
+62827,62827,62828,62828,62829,62829,62829,62830,62830,62831,62831,62832,62832,
+62833,62833,62834,62834,62835,62835,62836,62836,62836,62837,62837,62838,62838,
+62839,62839,62840,62840,62841,62841,62842,62842,62842,62843,62843,62844,62844,
+62845,62845,62846,62846,62847,62847,62848,62848,62849,62849,62849,62850,62850,
+62851,62851,62852,62852,62853,62853,62854,62854,62855,62855,62856,62856,62856,
+62857,62857,62858,62858,62859,62859,62860,62860,62861,62861,62862,62862,62862,
+62863,62863,62864,62864,62865,62865,62866,62866,62867,62867,62868,62868,62869,
+62869,62869,62870,62870,62871,62871,62872,62872,62873,62873,62874,62874,62875,
+62875,62875,62876,62876,62877,62877,62878,62878,62879,62879,62880,62880,62881,
+62881,62882,62882,62882,62883,62883,62884,62884,62885,62885,62886,62886,62887,
+62887,62888,62888,62888,62889,62889,62890,62890,62891,62891,62892,62892,62893,
+62893,62894,62894,62895,62895,62895,62896,62896,62897,62897,62898,62898,62899,
+62899,62900,62900,62901,62901,62901,62902,62902,62903,62903,62904,62904,62905,
+62905,62906,62906,62907,62907,62908,62908,62908,62909,62909,62910,62910,62911,
+62911,62912,62912,62913,62913,62914,62914,62914,62915,62915,62916,62916,62917,
+62917,62918,62918,62919,62919,62920,62920,62921,62921,62921,62922,62922,62923,
+62923,62924,62924,62925,62925,62926,62926,62927,62927,62927,62928,62928,62929,
+62929,62930,62930,62931,62931,62932,62932,62933,62933,62933,62934,62934,62935,
+62935,62936,62936,62937,62937,62938,62938,62939,62939,62940,62940,62940,62941,
+62941,62942,62942,62943,62943,62944,62944,62945,62945,62946,62946,62946,62947,
+62947,62948,62948,62949,62949,62950,62950,62951,62951,62952,62952,62953,62953,
+62953,62954,62954,62955,62955,62956,62956,62957,62957,62958,62958,62959,62959,
+62959,62960,62960,62961,62961,62962,62962,62963,62963,62964,62964,62965,62965,
+62965,62966,62966,62967,62967,62968,62968,62969,62969,62970,62970,62971,62971,
+62972,62972,62972,62973,62973,62974,62974,62975,62975,62976,62976,62977,62977,
+62978,62978,62978,62979,62979,62980,62980,62981,62981,62982,62982,62983,62983,
+62984,62984,62984,62985,62985,62986,62986,62987,62987,62988,62988,62989,62989,
+62990,62990,62991,62991,62991,62992,62992,62993,62993,62994,62994,62995,62995,
+62996,62996,62997,62997,62997,62998,62998,62999,62999,63000,63000,63001,63001,
+63002,63002,63003,63003,63003,63004,63004,63005,63005,63006,63006,63007,63007,
+63008,63008,63009,63009,63010,63010,63010,63011,63011,63012,63012,63013,63013,
+63014,63014,63015,63015,63016,63016,63016,63017,63017,63018,63018,63019,63019,
+63020,63020,63021,63021,63022,63022,63022,63023,63023,63024,63024,63025,63025,
+63026,63026,63027,63027,63028,63028,63028,63029,63029,63030,63030,63031,63031,
+63032,63032,63033,63033,63034,63034,63035,63035,63035,63036,63036,63037,63037,
+63038,63038,63039,63039,63040,63040,63041,63041,63041,63042,63042,63043,63043,
+63044,63044,63045,63045,63046,63046,63047,63047,63047,63048,63048,63049,63049,
+63050,63050,63051,63051,63052,63052,63053,63053,63053,63054,63054,63055,63055,
+63056,63056,63057,63057,63058,63058,63059,63059,63059,63060,63060,63061,63061,
+63062,63062,63063,63063,63064,63064,63065,63065,63066,63066,63066,63067,63067,
+63068,63068,63069,63069,63070,63070,63071,63071,63072,63072,63072,63073,63073,
+63074,63074,63075,63075,63076,63076,63077,63077,63078,63078,63078,63079,63079,
+63080,63080,63081,63081,63082,63082,63083,63083,63084,63084,63084,63085,63085,
+63086,63086,63087,63087,63088,63088,63089,63089,63090,63090,63090,63091,63091,
+63092,63092,63093,63093,63094,63094,63095,63095,63096,63096,63096,63097,63097,
+63098,63098,63099,63099,63100,63100,63101,63101,63102,63102,63102,63103,63103,
+63104,63104,63105,63105,63106,63106,63107,63107,63108,63108,63109,63109,63109,
+63110,63110,63111,63111,63112,63112,63113,63113,63114,63114,63115,63115,63115,
+63116,63116,63117,63117,63118,63118,63119,63119,63120,63120,63121,63121,63121,
+63122,63122,63123,63123,63124,63124,63125,63125,63126,63126,63127,63127,63127,
+63128,63128,63129,63129,63130,63130,63131,63131,63132,63132,63133,63133,63133,
+63134,63134,63135,63135,63136,63136,63137,63137,63138,63138,63139,63139,63139,
+63140,63140,63141,63141,63142,63142,63143,63143,63144,63144,63145,63145,63145,
+63146,63146,63147,63147,63148,63148,63149,63149,63150,63150,63151,63151,63151,
+63152,63152,63153,63153,63154,63154,63155,63155,63156,63156,63157,63157,63157,
+63158,63158,63159,63159,63160,63160,63161,63161,63162,63162,63163,63163,63163,
+63164,63164,63165,63165,63166,63166,63167,63167,63168,63168,63169,63169,63169,
+63170,63170,63171,63171,63172,63172,63173,63173,63174,63174,63175,63175,63175,
+63176,63176,63177,63177,63178,63178,63179,63179,63180,63180,63181,63181,63181,
+63182,63182,63183,63183,63184,63184,63185,63185,63186,63186,63187,63187,63187,
+63188,63188,63189,63189,63190,63190,63191,63191,63192,63192,63193,63193,63193,
+63194,63194,63195,63195,63196,63196,63197,63197,63198,63198,63199,63199,63199,
+63200,63200,63201,63201,63202,63202,63203,63203,63204,63204,63205,63205,63205,
+63206,63206,63207,63207,63208,63208,63209,63209,63210,63210,63211,63211,63211,
+63212,63212,63213,63213,63214,63214,63215,63215,63216,63216,63217,63217,63217,
+63218,63218,63219,63219,63220,63220,63221,63221,63222,63222,63223,63223,63223,
+63224,63224,63225,63225,63226,63226,63227,63227,63228,63228,63229,63229,63229,
+63230,63230,63231,63231,63232,63232,63233,63233,63234,63234,63234,63235,63235,
+63236,63236,63237,63237,63238,63238,63239,63239,63240,63240,63240,63241,63241,
+63242,63242,63243,63243,63244,63244,63245,63245,63246,63246,63246,63247,63247,
+63248,63248,63249,63249,63250,63250,63251,63251,63252,63252,63252,63253,63253,
+63254,63254,63255,63255,63256,63256,63257,63257,63258,63258,63258,63259,63259,
+63260,63260,63261,63261,63262,63262,63263,63263,63264,63264,63264,63265,63265,
+63266,63266,63267,63267,63268,63268,63269,63269,63270,63270,63270,63271,63271,
+63272,63272,63273,63273,63274,63274,63275,63275,63276,63276,63276,63277,63277,
+63278,63278,63279,63279,63280,63280,63281,63281,63281,63282,63282,63283,63283,
+63284,63284,63285,63285,63286,63286,63287,63287,63287,63288,63288,63289,63289,
+63290,63290,63291,63291,63292,63292,63293,63293,63293,63294,63294,63295,63295,
+63296,63296,63297,63297,63298,63298,63299,63299,63299,63300,63300,63301,63301,
+63302,63302,63303,63303,63304,63304,63305,63305,63305,63306,63306,63307,63307,
+63308,63308,63309,63309,63310,63310,63310,63311,63311,63312,63312,63313,63313,
+63314,63314,63315,63315,63316,63316,63316,63317,63317,63318,63318,63319,63319,
+63320,63320,63321,63321,63322,63322,63322,63323,63323,63324,63324,63325,63325,
+63326,63326,63327,63327,63328,63328,63328,63329,63329,63330,63330,63331,63331,
+63332,63332,63333,63333,63333,63334,63334,63335,63335,63336,63336,63337,63337,
+63338,63338,63339,63339,63339,63340,63340,63341,63341,63342,63342,63343,63343,
+63344,63344,63345,63345,63345,63346,63346,63347,63347,63348,63348,63349,63349,
+63350,63350,63351,63351,63351,63352,63352,63353,63353,63354,63354,63355,63355,
+63356,63356,63356,63357,63357,63358,63358,63359,63359,63360,63360,63361,63361,
+63362,63362,63362,63363,63363,63364,63364,63365,63365,63366,63366,63367,63367,
+63368,63368,63368,63369,63369,63370,63370,63371,63371,63372,63372,63373,63373,
+63373,63374,63374,63375,63375,63376,63376,63377,63377,63378,63378,63379,63379,
+63379,63380,63380,63381,63381,63382,63382,63383,63383,63384,63384,63385,63385,
+63385,63386,63386,63387,63387,63388,63388,63389,63389,63390,63390,63390,63391,
+63391,63392,63392,63393,63393,63394,63394,63395,63395,63396,63396,63396,63397,
+63397,63398,63398,63399,63399,63400,63400,63401,63401,63402,63402,63402,63403,
+63403,63404,63404,63405,63405,63406,63406,63407,63407,63407,63408,63408,63409,
+63409,63410,63410,63411,63411,63412,63412,63413,63413,63413,63414,63414,63415,
+63415,63416,63416,63417,63417,63418,63418,63419,63419,63419,63420,63420,63421,
+63421,63422,63422,63423,63423,63424,63424,63424,63425,63425,63426,63426,63427,
+63427,63428,63428,63429,63429,63430,63430,63430,63431,63431,63432,63432,63433,
+63433,63434,63434,63435,63435,63435,63436,63436,63437,63437,63438,63438,63439,
+63439,63440,63440,63441,63441,63441,63442,63442,63443,63443,63444,63444,63445,
+63445,63446,63446,63447,63447,63447,63448,63448,63449,63449,63450,63450,63451,
+63451,63452,63452,63452,63453,63453,63454,63454,63455,63455,63456,63456,63457,
+63457,63458,63458,63458,63459,63459,63460,63460,63461,63461,63462,63462,63463,
+63463,63463,63464,63464,63465,63465,63466,63466,63467,63467,63468,63468,63469,
+63469,63469,63470,63470,63471,63471,63472,63472,63473,63473,63474,63474,63474,
+63475,63475,63476,63476,63477,63477,63478,63478,63479,63479,63480,63480,63480,
+63481,63481,63482,63482,63483,63483,63484,63484,63485,63485,63485,63486,63486,
+63487,63487,63488,63488,63489,63489,63490,63490,63491,63491,63491,63492,63492,
+63493,63493,63494,63494,63495,63495,63496,63496,63496,63497,63497,63498,63498,
+63499,63499,63500,63500,63501,63501,63502,63502,63502,63503,63503,63504,63504,
+63505,63505,63506,63506,63507,63507,63507,63508,63508,63509,63509,63510,63510,
+63511,63511,63512,63512,63513,63513,63513,63514,63514,63515,63515,63516,63516,
+63517,63517,63518,63518,63518,63519,63519,63520,63520,63521,63521,63522,63522,
+63523,63523,63524,63524,63524,63525,63525,63526,63526,63527,63527,63528,63528,
+63529,63529,63529,63530,63530,63531,63531,63532,63532,63533,63533,63534,63534,
+63535,63535,63535,63536,63536,63537,63537,63538,63538,63539,63539,63540,63540,
+63540,63541,63541,63542,63542,63543,63543,63544,63544,63545,63545,63546,63546,
+63546,63547,63547,63548,63548,63549,63549,63550,63550,63551,63551,63551,63552,
+63552,63553,63553,63554,63554,63555,63555,63556,63556,63557,63557,63557,63558,
+63558,63559,63559,63560,63560,63561,63561,63562,63562,63562,63563,63563,63564,
+63564,63565,63565,63566,63566,63567,63567,63567,63568,63568,63569,63569,63570,
+63570,63571,63571,63572,63572,63573,63573,63573,63574,63574,63575,63575,63576,
+63576,63577,63577,63578,63578,63578,63579,63579,63580,63580,63581,63581,63582,
+63582,63583,63583,63584,63584,63584,63585,63585,63586,63586,63587,63587,63588,
+63588,63589,63589,63589,63590,63590,63591,63591,63592,63592,63593,63593,63594,
+63594,63594,63595,63595,63596,63596,63597,63597,63598,63598,63599,63599,63600,
+63600,63600,63601,63601,63602,63602,63603,63603,63604,63604,63605,63605,63605,
+63606,63606,63607,63607,63608,63608,63609,63609,63610,63610,63611,63611,63611,
+63612,63612,63613,63613,63614,63614,63615,63615,63616,63616,63616,63617,63617,
+63618,63618,63619,63619,63620,63620,63621,63621,63621,63622,63622,63623,63623,
+63624,63624,63625,63625,63626,63626,63627,63627,63627,63628,63628,63629,63629,
+63630,63630,63631,63631,63632,63632,63632,63633,63633,63634,63634,63635,63635,
+63636,63636,63637,63637,63637,63638,63638,63639,63639,63640,63640,63641,63641,
+63642,63642,63643,63643,63643,63644,63644,63645,63645,63646,63646,63647,63647,
+63648,63648,63648,63649,63649,63650,63650,63651,63651,63652,63652,63653,63653,
+63653,63654,63654,63655,63655,63656,63656,63657,63657,63658,63658,63658,63659,
+63659,63660,63660,63661,63661,63662,63662,63663,63663,63664,63664,63664,63665,
+63665,63666,63666,63667,63667,63668,63668,63669,63669,63669,63670,63670,63671,
+63671,63672,63672,63673,63673,63674,63674,63674,63675,63675,63676,63676,63677,
+63677,63678,63678,63679,63679,63680,63680,63680,63681,63681,63682,63682,63683,
+63683,63684,63684,63685,63685,63685,63686,63686,63687,63687,63688,63688,63689,
+63689,63690,63690,63690,63691,63691,63692,63692,63693,63693,63694,63694,63695,
+63695,63695,63696,63696,63697,63697,63698,63698,63699,63699,63700,63700,63701,
+63701,63701,63702,63702,63703,63703,63704,63704,63705,63705,63706,63706,63706,
+63707,63707,63708,63708,63709,63709,63710,63710,63711,63711,63711,63712,63712,
+63713,63713,63714,63714,63715,63715,63716,63716,63716,63717,63717,63718,63718,
+63719,63719,63720,63720,63721,63721,63722,63722,63722,63723,63723,63724,63724,
+63725,63725,63726,63726,63727,63727,63727,63728,63728,63729,63729,63730,63730,
+63731,63731,63732,63732,63732,63733,63733,63734,63734,63735,63735,63736,63736,
+63737,63737,63737,63738,63738,63739,63739,63740,63740,63741,63741,63742,63742,
+63742,63743,63743,63744,63744,63745,63745,63746,63746,63747,63747,63748,63748,
+63748,63749,63749,63750,63750,63751,63751,63752,63752,63753,63753,63753,63754,
+63754,63755,63755,63756,63756,63757,63757,63758,63758,63758,63759,63759,63760,
+63760,63761,63761,63762,63762,63763,63763,63763,63764,63764,63765,63765,63766,
+63766,63767,63767,63768,63768,63768,63769,63769,63770,63770,63771,63771,63772,
+63772,63773,63773,63773,63774,63774,63775,63775,63776,63776,63777,63777,63778,
+63778,63779,63779,63779,63780,63780,63781,63781,63782,63782,63783,63783,63784,
+63784,63784,63785,63785,63786,63786,63787,63787,63788,63788,63789,63789,63789,
+63790,63790,63791,63791,63792,63792,63793,63793,63794,63794,63794,63795,63795,
+63796,63796,63797,63797,63798,63798,63799,63799,63799,63800,63800,63801,63801,
+63802,63802,63803,63803,63804,63804,63804,63805,63805,63806,63806,63807,63807,
+63808,63808,63809,63809,63809,63810,63810,63811,63811,63812,63812,63813,63813,
+63814,63814,63814,63815,63815,63816,63816,63817,63817,63818,63818,63819,63819,
+63819,63820,63820,63821,63821,63822,63822,63823,63823,63824,63824,63825,63825,
+63825,63826,63826,63827,63827,63828,63828,63829,63829,63830,63830,63830,63831,
+63831,63832,63832,63833,63833,63834,63834,63835,63835,63835,63836,63836,63837,
+63837,63838,63838,63839,63839,63840,63840,63840,63841,63841,63842,63842,63843,
+63843,63844,63844,63845,63845,63845,63846,63846,63847,63847,63848,63848,63849,
+63849,63850,63850,63850,63851,63851,63852,63852,63853,63853,63854,63854,63855,
+63855,63855,63856,63856,63857,63857,63858,63858,63859,63859,63860,63860,63860,
+63861,63861,63862,63862,63863,63863,63864,63864,63865,63865,63865,63866,63866,
+63867,63867,63868,63868,63869,63869,63870,63870,63870,63871,63871,63872,63872,
+63873,63873,63874,63874,63875,63875,63875,63876,63876,63877,63877,63878,63878,
+63879,63879,63880,63880,63880,63881,63881,63882,63882,63883,63883,63884,63884,
+63885,63885,63885,63886,63886,63887,63887,63888,63888,63889,63889,63890,63890,
+63890,63891,63891,63892,63892,63893,63893,63894,63894,63895,63895,63895,63896,
+63896,63897,63897,63898,63898,63899,63899,63900,63900,63900,63901,63901,63902,
+63902,63903,63903,63904,63904,63905,63905,63905,63906,63906,63907,63907,63908,
+63908,63909,63909,63910,63910,63910,63911,63911,63912,63912,63913,63913,63914,
+63914,63915,63915,63915,63916,63916,63917,63917,63918,63918,63919,63919,63920,
+63920,63920,63921,63921,63922,63922,63923,63923,63924,63924,63925,63925,63925,
+63926,63926,63927,63927,63928,63928,63929,63929,63930,63930,63930,63931,63931,
+63932,63932,63933,63933,63934,63934,63935,63935,63935,63936,63936,63937,63937,
+63938,63938,63939,63939,63940,63940,63940,63941,63941,63942,63942,63943,63943,
+63944,63944,63945,63945,63945,63946,63946,63947,63947,63948,63948,63949,63949,
+63950,63950,63950,63951,63951,63952,63952,63953,63953,63954,63954,63955,63955,
+63955,63956,63956,63957,63957,63958,63958,63959,63959,63960,63960,63960,63961,
+63961,63962,63962,63963,63963,63964,63964,63965,63965,63965,63966,63966,63967,
+63967,63968,63968,63969,63969,63970,63970,63970,63971,63971,63972,63972,63973,
+63973,63974,63974,63975,63975,63975,63976,63976,63977,63977,63978,63978,63979,
+63979,63980,63980,63980,63981,63981,63982,63982,63983,63983,63984,63984,63984,
+63985,63985,63986,63986,63987,63987,63988,63988,63989,63989,63989,63990,63990,
+63991,63991,63992,63992,63993,63993,63994,63994,63994,63995,63995,63996,63996,
+63997,63997,63998,63998,63999,63999,63999,64000,64000,64001,64001,64002,64002,
+64003,64003,64004,64004,64004,64005,64005,64006,64006,64007,64007,64008,64008,
+64009,64009,64009,64010,64010,64011,64011,64012,64012,64013,64013,64014,64014,
+64014,64015,64015,64016,64016,64017,64017,64018,64018,64019,64019,64019,64020,
+64020,64021,64021,64022,64022,64023,64023,64024,64024,64024,64025,64025,64026,
+64026,64027,64027,64028,64028,64028,64029,64029,64030,64030,64031,64031,64032,
+64032,64033,64033,64033,64034,64034,64035,64035,64036,64036,64037,64037,64038,
+64038,64038,64039,64039,64040,64040,64041,64041,64042,64042,64043,64043,64043,
+64044,64044,64045,64045,64046,64046,64047,64047,64048,64048,64048,64049,64049,
+64050,64050,64051,64051,64052,64052,64053,64053,64053,64054,64054,64055,64055,
+64056,64056,64057,64057,64057,64058,64058,64059,64059,64060,64060,64061,64061,
+64062,64062,64062,64063,64063,64064,64064,64065,64065,64066,64066,64067,64067,
+64067,64068,64068,64069,64069,64070,64070,64071,64071,64072,64072,64072,64073,
+64073,64074,64074,64075,64075,64076,64076,64077,64077,64077,64078,64078,64079,
+64079,64080,64080,64081,64081,64082,64082,64082,64083,64083,64084,64084,64085,
+64085,64086,64086,64086,64087,64087,64088,64088,64089,64089,64090,64090,64091,
+64091,64091,64092,64092,64093,64093,64094,64094,64095,64095,64096,64096,64096,
+64097,64097,64098,64098,64099,64099,64100,64100,64101,64101,64101,64102,64102,
+64103,64103,64104,64104,64105,64105,64106,64106,64106,64107,64107,64108,64108,
+64109,64109,64110,64110,64110,64111,64111,64112,64112,64113,64113,64114,64114,
+64115,64115,64115,64116,64116,64117,64117,64118,64118,64119,64119,64120,64120,
+64120,64121,64121,64122,64122,64123,64123,64124,64124,64125,64125,64125,64126,
+64126,64127,64127,64128,64128,64129,64129,64129,64130,64130,64131,64131,64132,
+64132,64133,64133,64134,64134,64134,64135,64135,64136,64136,64137,64137,64138,
+64138,64139,64139,64139,64140,64140,64141,64141,64142,64142,64143,64143,64144,
+64144,64144,64145,64145,64146,64146,64147,64147,64148,64148,64148,64149,64149,
+64150,64150,64151,64151,64152,64152,64153,64153,64153,64154,64154,64155,64155,
+64156,64156,64157,64157,64158,64158,64158,64159,64159,64160,64160,64161,64161,
+64162,64162,64163,64163,64163,64164,64164,64165,64165,64166,64166,64167,64167,
+64167,64168,64168,64169,64169,64170,64170,64171,64171,64172,64172,64172,64173,
+64173,64174,64174,64175,64175,64176,64176,64177,64177,64177,64178,64178,64179,
+64179,64180,64180,64181,64181,64181,64182,64182,64183,64183,64184,64184,64185,
+64185,64186,64186,64186,64187,64187,64188,64188,64189,64189,64190,64190,64191,
+64191,64191,64192,64192,64193,64193,64194,64194,64195,64195,64195,64196,64196,
+64197,64197,64198,64198,64199,64199,64200,64200,64200,64201,64201,64202,64202,
+64203,64203,64204,64204,64205,64205,64205,64206,64206,64207,64207,64208,64208,
+64209,64209,64209,64210,64210,64211,64211,64212,64212,64213,64213,64214,64214,
+64214,64215,64215,64216,64216,64217,64217,64218,64218,64219,64219,64219,64220,
+64220,64221,64221,64222,64222,64223,64223,64223,64224,64224,64225,64225,64226,
+64226,64227,64227,64228,64228,64228,64229,64229,64230,64230,64231,64231,64232,
+64232,64233,64233,64233,64234,64234,64235,64235,64236,64236,64237,64237,64237,
+64238,64238,64239,64239,64240,64240,64241,64241,64242,64242,64242,64243,64243,
+64244,64244,64245,64245,64246,64246,64247,64247,64247,64248,64248,64249,64249,
+64250,64250,64251,64251,64251,64252,64252,64253,64253,64254,64254,64255,64255,
+64256,64256,64256,64257,64257,64258,64258,64259,64259,64260,64260,64261,64261,
+64261,64262,64262,64263,64263,64264,64264,64265,64265,64265,64266,64266,64267,
+64267,64268,64268,64269,64269,64270,64270,64270,64271,64271,64272,64272,64273,
+64273,64274,64274,64274,64275,64275,64276,64276,64277,64277,64278,64278,64279,
+64279,64279,64280,64280,64281,64281,64282,64282,64283,64283,64284,64284,64284,
+64285,64285,64286,64286,64287,64287,64288,64288,64288,64289,64289,64290,64290,
+64291,64291,64292,64292,64293,64293,64293,64294,64294,64295,64295,64296,64296,
+64297,64297,64297,64298,64298,64299,64299,64300,64300,64301,64301,64302,64302,
+64302,64303,64303,64304,64304,64305,64305,64306,64306,64307,64307,64307,64308,
+64308,64309,64309,64310,64310,64311,64311,64311,64312,64312,64313,64313,64314,
+64314,64315,64315,64316,64316,64316,64317,64317,64318,64318,64319,64319,64320,
+64320,64320,64321,64321,64322,64322,64323,64323,64324,64324,64325,64325,64325,
+64326,64326,64327,64327,64328,64328,64329,64329,64329,64330,64330,64331,64331,
+64332,64332,64333,64333,64334,64334,64334,64335,64335,64336,64336,64337,64337,
+64338,64338,64339,64339,64339,64340,64340,64341,64341,64342,64342,64343,64343,
+64343,64344,64344,64345,64345,64346,64346,64347,64347,64348,64348,64348,64349,
+64349,64350,64350,64351,64351,64352,64352,64352,64353,64353,64354,64354,64355,
+64355,64356,64356,64357,64357,64357,64358,64358,64359,64359,64360,64360,64361,
+64361,64361,64362,64362,64363,64363,64364,64364,64365,64365,64366,64366,64366,
+64367,64367,64368,64368,64369,64369,64370,64370,64370,64371,64371,64372,64372,
+64373,64373,64374,64374,64375,64375,64375,64376,64376,64377,64377,64378,64378,
+64379,64379,64379,64380,64380,64381,64381,64382,64382,64383,64383,64384,64384,
+64384,64385,64385,64386,64386,64387,64387,64388,64388,64388,64389,64389,64390,
+64390,64391,64391,64392,64392,64393,64393,64393,64394,64394,64395,64395,64396,
+64396,64397,64397,64397,64398,64398,64399,64399,64400,64400,64401,64401,64402,
+64402,64402,64403,64403,64404,64404,64405,64405,64406,64406,64406,64407,64407,
+64408,64408,64409,64409,64410,64410,64411,64411,64411,64412,64412,64413,64413,
+64414,64414,64415,64415,64415,64416,64416,64417,64417,64418,64418,64419,64419,
+64420,64420,64420,64421,64421,64422,64422,64423,64423,64424,64424,64424,64425,
+64425,64426,64426,64427,64427,64428,64428,64429,64429,64429,64430,64430,64431,
+64431,64432,64432,64433,64433,64433,64434,64434,64435,64435,64436,64436,64437,
+64437,64438,64438,64438,64439,64439,64440,64440,64441,64441,64442,64442,64442,
+64443,64443,64444,64444,64445,64445,64446,64446,64446,64447,64447,64448,64448,
+64449,64449,64450,64450,64451,64451,64451,64452,64452,64453,64453,64454,64454,
+64455,64455,64455,64456,64456,64457,64457,64458,64458,64459,64459,64460,64460,
+64460,64461,64461,64462,64462,64463,64463,64464,64464,64464,64465,64465,64466,
+64466,64467,64467,64468,64468,64469,64469,64469,64470,64470,64471,64471,64472,
+64472,64473,64473,64473,64474,64474,64475,64475,64476,64476,64477,64477,64477,
+64478,64478,64479,64479,64480,64480,64481,64481,64482,64482,64482,64483,64483,
+64484,64484,64485,64485,64486,64486,64486,64487,64487,64488,64488,64489,64489,
+64490,64490,64491,64491,64491,64492,64492,64493,64493,64494,64494,64495,64495,
+64495,64496,64496,64497,64497,64498,64498,64499,64499,64500,64500,64500,64501,
+64501,64502,64502,64503,64503,64504,64504,64504,64505,64505,64506,64506,64507,
+64507,64508,64508,64508,64509,64509,64510,64510,64511,64511,64512,64512,64513,
+64513,64513,64514,64514,64515,64515,64516,64516,64517,64517,64517,64518,64518,
+64519,64519,64520,64520,64521,64521,64521,64522,64522,64523,64523,64524,64524,
+64525,64525,64526,64526,64526,64527,64527,64528,64528,64529,64529,64530,64530,
+64530,64531,64531,64532,64532,64533,64533,64534,64534,64535,64535,64535,64536,
+64536,64537,64537,64538,64538,64539,64539,64539,64540,64540,64541,64541,64542,
+64542,64543,64543,64543,64544,64544,64545,64545,64546,64546,64547,64547,64548,
+64548,64548,64549,64549,64550,64550,64551,64551,64552,64552,64552,64553,64553,
+64554,64554,64555,64555,64556,64556,64556,64557,64557,64558,64558,64559,64559,
+64560,64560,64561,64561,64561,64562,64562,64563,64563,64564,64564,64565,64565,
+64565,64566,64566,64567,64567,64568,64568,64569,64569,64569,64570,64570,64571,
+64571,64572,64572,64573,64573,64574,64574,64574,64575,64575,64576,64576,64577,
+64577,64578,64578,64578,64579,64579,64580,64580,64581,64581,64582,64582,64582,
+64583,64583,64584,64584,64585,64585,64586,64586,64587,64587,64587,64588,64588,
+64589,64589,64590,64590,64591,64591,64591,64592,64592,64593,64593,64594,64594,
+64595,64595,64595,64596,64596,64597,64597,64598,64598,64599,64599,64600,64600,
+64600,64601,64601,64602,64602,64603,64603,64604,64604,64604,64605,64605,64606,
+64606,64607,64607,64608,64608,64608,64609,64609,64610,64610,64611,64611,64612,
+64612,64613,64613,64613,64614,64614,64615,64615,64616,64616,64617,64617,64617,
+64618,64618,64619,64619,64620,64620,64621,64621,64621,64622,64622,64623,64623,
+64624,64624,64625,64625,64625,64626,64626,64627,64627,64628,64628,64629,64629,
+64630,64630,64630,64631,64631,64632,64632,64633,64633,64634,64634,64634,64635,
+64635,64636,64636,64637,64637,64638,64638,64638,64639,64639,64640,64640,64641,
+64641,64642,64642,64643,64643,64643,64644,64644,64645,64645,64646,64646,64647,
+64647,64647,64648,64648,64649,64649,64650,64650,64651,64651,64651,64652,64652,
+64653,64653,64654,64654,64655,64655,64655,64656,64656,64657,64657,64658,64658,
+64659,64659,64660,64660,64660,64661,64661,64662,64662,64663,64663,64664,64664,
+64664,64665,64665,64666,64666,64667,64667,64668,64668,64668,64669,64669,64670,
+64670,64671,64671,64672,64672,64672,64673,64673,64674,64674,64675,64675,64676,
+64676,64677,64677,64677,64678,64678,64679,64679,64680,64680,64681,64681,64681,
+64682,64682,64683,64683,64684,64684,64685,64685,64685,64686,64686,64687,64687,
+64688,64688,64689,64689,64689,64690,64690,64691,64691,64692,64692,64693,64693,
+64694,64694,64694,64695,64695,64696,64696,64697,64697,64698,64698,64698,64699,
+64699,64700,64700,64701,64701,64702,64702,64702,64703,64703,64704,64704,64705,
+64705,64706,64706,64706,64707,64707,64708,64708,64709,64709,64710,64710,64711,
+64711,64711,64712,64712,64713,64713,64714,64714,64715,64715,64715,64716,64716,
+64717,64717,64718,64718,64719,64719,64719,64720,64720,64721,64721,64722,64722,
+64723,64723,64723,64724,64724,64725,64725,64726,64726,64727,64727,64727,64728,
+64728,64729,64729,64730,64730,64731,64731,64732,64732,64732,64733,64733,64734,
+64734,64735,64735,64736,64736,64736,64737,64737,64738,64738,64739,64739,64740,
+64740,64740,64741,64741,64742,64742,64743,64743,64744,64744,64744,64745,64745,
+64746,64746,64747,64747,64748,64748,64748,64749,64749,64750,64750,64751,64751,
+64752,64752,64753,64753,64753,64754,64754,64755,64755,64756,64756,64757,64757,
+64757,64758,64758,64759,64759,64760,64760,64761,64761,64761,64762,64762,64763,
+64763,64764,64764,64765,64765,64765,64766,64766,64767,64767,64768,64768,64769,
+64769,64769,64770,64770,64771,64771,64772,64772,64773,64773,64773,64774,64774,
+64775,64775,64776,64776,64777,64777,64778,64778,64778,64779,64779,64780,64780,
+64781,64781,64782,64782,64782,64783,64783,64784,64784,64785,64785,64786,64786,
+64786,64787,64787,64788,64788,64789,64789,64790,64790,64790,64791,64791,64792,
+64792,64793,64793,64794,64794,64794,64795,64795,64796,64796,64797,64797,64798,
+64798,64798,64799,64799,64800,64800,64801,64801,64802,64802,64803,64803,64803,
+64804,64804,64805,64805,64806,64806,64807,64807,64807,64808,64808,64809,64809,
+64810,64810,64811,64811,64811,64812,64812,64813,64813,64814,64814,64815,64815,
+64815,64816,64816,64817,64817,64818,64818,64819,64819,64819,64820,64820,64821,
+64821,64822,64822,64823,64823,64823,64824,64824,64825,64825,64826,64826,64827,
+64827,64827,64828,64828,64829,64829,64830,64830,64831,64831,64832,64832,64832,
+64833,64833,64834,64834,64835,64835,64836,64836,64836,64837,64837,64838,64838,
+64839,64839,64840,64840,64840,64841,64841,64842,64842,64843,64843,64844,64844,
+64844,64845,64845,64846,64846,64847,64847,64848,64848,64848,64849,64849,64850,
+64850,64851,64851,64852,64852,64852,64853,64853,64854,64854,64855,64855,64856,
+64856,64856,64857,64857,64858,64858,64859,64859,64860,64860,64860,64861,64861,
+64862,64862,64863,64863,64864,64864,64864,64865,64865,64866,64866,64867,64867,
+64868,64868,64869,64869,64869,64870,64870,64871,64871,64872,64872,64873,64873,
+64873,64874,64874,64875,64875,64876,64876,64877,64877,64877,64878,64878,64879,
+64879,64880,64880,64881,64881,64881,64882,64882,64883,64883,64884,64884,64885,
+64885,64885,64886,64886,64887,64887,64888,64888,64889,64889,64889,64890,64890,
+64891,64891,64892,64892,64893,64893,64893,64894,64894,64895,64895,64896,64896,
+64897,64897,64897,64898,64898,64899,64899,64900,64900,64901,64901,64901,64902,
+64902,64903,64903,64904,64904,64905,64905,64905,64906,64906,64907,64907,64908,
+64908,64909,64909,64909,64910,64910,64911,64911,64912,64912,64913,64913,64913,
+64914,64914,64915,64915,64916,64916,64917,64917,64917,64918,64918,64919,64919,
+64920,64920,64921,64921,64921,64922,64922,64923,64923,64924,64924,64925,64925,
+64926,64926,64926,64927,64927,64928,64928,64929,64929,64930,64930,64930,64931,
+64931,64932,64932,64933,64933,64934,64934,64934,64935,64935,64936,64936,64937,
+64937,64938,64938,64938,64939,64939,64940,64940,64941,64941,64942,64942,64942,
+64943,64943,64944,64944,64945,64945,64946,64946,64946,64947,64947,64948,64948,
+64949,64949,64950,64950,64950,64951,64951,64952,64952,64953,64953,64954,64954,
+64954,64955,64955,64956,64956,64957,64957,64958,64958,64958,64959,64959,64960,
+64960,64961,64961,64962,64962,64962,64963,64963,64964,64964,64965,64965,64966,
+64966,64966,64967,64967,64968,64968,64969,64969,64970,64970,64970,64971,64971,
+64972,64972,64973,64973,64974,64974,64974,64975,64975,64976,64976,64977,64977,
+64978,64978,64978,64979,64979,64980,64980,64981,64981,64982,64982,64982,64983,
+64983,64984,64984,64985,64985,64986,64986,64986,64987,64987,64988,64988,64989,
+64989,64990,64990,64990,64991,64991,64992,64992,64993,64993,64994,64994,64994,
+64995,64995,64996,64996,64997,64997,64998,64998,64998,64999,64999,65000,65000,
+65001,65001,65002,65002,65002,65003,65003,65004,65004,65005,65005,65006,65006,
+65006,65007,65007,65008,65008,65009,65009,65010,65010,65010,65011,65011,65012,
+65012,65013,65013,65014,65014,65014,65015,65015,65016,65016,65017,65017,65018,
+65018,65018,65019,65019,65020,65020,65021,65021,65022,65022,65022,65023,65023,
+65024,65024,65025,65025,65026,65026,65026,65027,65027,65028,65028,65029,65029,
+65030,65030,65030,65031,65031,65032,65032,65033,65033,65034,65034,65034,65035,
+65035,65036,65036,65037,65037,65038,65038,65038,65039,65039,65040,65040,65041,
+65041,65042,65042,65042,65043,65043,65044,65044,65045,65045,65046,65046,65046,
+65047,65047,65048,65048,65049,65049,65050,65050,65050,65051,65051,65052,65052,
+65053,65053,65054,65054,65054,65055,65055,65056,65056,65057,65057,65058,65058,
+65058,65059,65059,65060,65060,65061,65061,65062,65062,65062,65063,65063,65064,
+65064,65065,65065,65065,65066,65066,65067,65067,65068,65068,65069,65069,65069,
+65070,65070,65071,65071,65072,65072,65073,65073,65073,65074,65074,65075,65075,
+65076,65076,65077,65077,65077,65078,65078,65079,65079,65080,65080,65081,65081,
+65081,65082,65082,65083,65083,65084,65084,65085,65085,65085,65086,65086,65087,
+65087,65088,65088,65089,65089,65089,65090,65090,65091,65091,65092,65092,65093,
+65093,65093,65094,65094,65095,65095,65096,65096,65097,65097,65097,65098,65098,
+65099,65099,65100,65100,65101,65101,65101,65102,65102,65103,65103,65104,65104,
+65105,65105,65105,65106,65106,65107,65107,65108,65108,65109,65109,65109,65110,
+65110,65111,65111,65112,65112,65113,65113,65113,65114,65114,65115,65115,65116,
+65116,65117,65117,65117,65118,65118,65119,65119,65120,65120,65120,65121,65121,
+65122,65122,65123,65123,65124,65124,65124,65125,65125,65126,65126,65127,65127,
+65128,65128,65128,65129,65129,65130,65130,65131,65131,65132,65132,65132,65133,
+65133,65134,65134,65135,65135,65136,65136,65136,65137,65137,65138,65138,65139,
+65139,65140,65140,65140,65141,65141,65142,65142,65143,65143,65144,65144,65144,
+65145,65145,65146,65146,65147,65147,65148,65148,65148,65149,65149,65150,65150,
+65151,65151,65152,65152,65152,65153,65153,65154,65154,65155,65155,65156,65156,
+65156,65157,65157,65158,65158,65159,65159,65159,65160,65160,65161,65161,65162,
+65162,65163,65163,65163,65164,65164,65165,65165,65166,65166,65167,65167,65167,
+65168,65168,65169,65169,65170,65170,65171,65171,65171,65172,65172,65173,65173,
+65174,65174,65175,65175,65175,65176,65176,65177,65177,65178,65178,65179,65179,
+65179,65180,65180,65181,65181,65182,65182,65183,65183,65183,65184,65184,65185,
+65185,65186,65186,65187,65187,65187,65188,65188,65189,65189,65190,65190,65190,
+65191,65191,65192,65192,65193,65193,65194,65194,65194,65195,65195,65196,65196,
+65197,65197,65198,65198,65198,65199,65199,65200,65200,65201,65201,65202,65202,
+65202,65203,65203,65204,65204,65205,65205,65206,65206,65206,65207,65207,65208,
+65208,65209,65209,65210,65210,65210,65211,65211,65212,65212,65213,65213,65213,
+65214,65214,65215,65215,65216,65216,65217,65217,65217,65218,65218,65219,65219,
+65220,65220,65221,65221,65221,65222,65222,65223,65223,65224,65224,65225,65225,
+65225,65226,65226,65227,65227,65228,65228,65229,65229,65229,65230,65230,65231,
+65231,65232,65232,65233,65233,65233,65234,65234,65235,65235,65236,65236,65237,
+65237,65237,65238,65238,65239,65239,65240,65240,65240,65241,65241,65242,65242,
+65243,65243,65244,65244,65244,65245,65245,65246,65246,65247,65247,65248,65248,
+65248,65249,65249,65250,65250,65251,65251,65252,65252,65252,65253,65253,65254,
+65254,65255,65255,65256,65256,65256,65257,65257,65258,65258,65259,65259,65259,
+65260,65260,65261,65261,65262,65262,65263,65263,65263,65264,65264,65265,65265,
+65266,65266,65267,65267,65267,65268,65268,65269,65269,65270,65270,65271,65271,
+65271,65272,65272,65273,65273,65274,65274,65275,65275,65275,65276,65276,65277,
+65277,65278,65278,65278,65279,65279,65280,65280,65281,65281,65282,65282,65282,
+65283,65283,65284,65284,65285,65285,65286,65286,65286,65287,65287,65288,65288,
+65289,65289,65290,65290,65290,65291,65291,65292,65292,65293,65293,65294,65294,
+65294,65295,65295,65296,65296,65297,65297,65297,65298,65298,65299,65299,65300,
+65300,65301,65301,65301,65302,65302,65303,65303,65304,65304,65305,65305,65305,
+65306,65306,65307,65307,65308,65308,65309,65309,65309,65310,65310,65311,65311,
+65312,65312,65313,65313,65313,65314,65314,65315,65315,65316,65316,65316,65317,
+65317,65318,65318,65319,65319,65320,65320,65320,65321,65321,65322,65322,65323,
+65323,65324,65324,65324,65325,65325,65326,65326,65327,65327,65328,65328,65328,
+65329,65329,65330,65330,65331,65331,65331,65332,65332,65333,65333,65334,65334,
+65335,65335,65335,65336,65336,65337,65337,65338,65338,65339,65339,65339,65340,
+65340,65341,65341,65342,65342,65343,65343,65343,65344,65344,65345,65345,65346,
+65346,65346,65347,65347,65348,65348,65349,65349,65350,65350,65350,65351,65351,
+65352,65352,65353,65353,65354,65354,65354,65355,65355,65356,65356,65357,65357,
+65358,65358,65358,65359,65359,65360,65360,65361,65361,65361,65362,65362,65363,
+65363,65364,65364,65365,65365,65365,65366,65366,65367,65367,65368,65368,65369,
+65369,65369,65370,65370,65371,65371,65372,65372,65373,65373,65373,65374,65374,
+65375,65375,65376,65376,65376,65377,65377,65378,65378,65379,65379,65380,65380,
+65380,65381,65381,65382,65382,65383,65383,65384,65384,65384,65385,65385,65386,
+65386,65387,65387,65388,65388,65388,65389,65389,65390,65390,65391,65391,65391,
+65392,65392,65393,65393,65394,65394,65395,65395,65395,65396,65396,65397,65397,
+65398,65398,65399,65399,65399,65400,65400,65401,65401,65402,65402,65403,65403,
+65403,65404,65404,65405,65405,65406,65406,65406,65407,65407,65408,65408,65409,
+65409,65410,65410,65410,65411,65411,65412,65412,65413,65413,65414,65414,65414,
+65415,65415,65416,65416,65417,65417,65417,65418,65418,65419,65419,65420,65420,
+65421,65421,65421,65422,65422,65423,65423,65424,65424,65425,65425,65425,65426,
+65426,65427,65427,65428,65428,65428,65429,65429,65430,65430,65431,65431,65432,
+65432,65432,65433,65433,65434,65434,65435,65435,65436,65436,65436,65437,65437,
+65438,65438,65439,65439,65440,65440,65440,65441,65441,65442,65442,65443,65443,
+65443,65444,65444,65445,65445,65446,65446,65447,65447,65447,65448,65448,65449,
+65449,65450,65450,65451,65451,65451,65452,65452,65453,65453,65454,65454,65454,
+65455,65455,65456,65456,65457,65457,65458,65458,65458,65459,65459,65460,65460,
+65461,65461,65462,65462,65462,65463,65463,65464,65464,65465,65465,65465,65466,
+65466,65467,65467,65468,65468,65469,65469,65469,65470,65470,65471,65471,65472,
+65472,65473,65473,65473,65474,65474,65475,65475,65476,65476,65476,65477,65477,
+65478,65478,65479,65479,65480,65480,65480,65481,65481,65482,65482,65483,65483,
+65484,65484,65484,65485,65485,65486,65486,65487,65487,65487,65488,65488,65489,
+65489,65490,65490,65491,65491,65491,65492,65492,65493,65493,65494,65494,65495,
+65495,65495,65496,65496,65497,65497,65498,65498,65498,65499,65499,65500,65500,
+65501,65501,65502,65502,65502,65503,65503,65504,65504,65505,65505,65506,65506,
+65506,65507,65507,65508,65508,65509,65509,65509,65510,65510,65511,65511,65512,
+65512,65513,65513,65513,65514,65514,65515,65515,65516,65516,65517,65517,65517,
+65518,65518,65519,65519,65520,65520,65520,65521,65521,65522,65522,65523,65523,
+65524,65524,65524,65525,65525,65526,65526,65527,65527,65528,65528,65528,65529,
+65529,65530,65530,65531,65531,65531,65532,65532,65533,65533,65534,65534,65535,
+65535
+};
+
index 3a0732f28e086ed8f758c7955ad1e4f0d9eb285b..64af7be230475f955aa182f5403604870eed967e 100644 (file)
 #include <stdlib.h>
 #include "babl.h"
 
+#include "base/util.h"
+#include "extensions/cairo-tables.h"
+
 int init (void);
 
+static inline long
+conv_rgba8_cairo24_le (unsigned char *src, unsigned char *dst, long samples)
+{
+  long n = samples;
+  while (n--)
+    {
+      dst[0] = src[2];
+      dst[1] = src[1];
+      dst[2] = src[0];
+      dst[3] = src[0];
+      src+=4;
+      dst+=4;
+    }
+  return samples;
+}
+
+static inline long
+conv_rgb8_cairo24_le (unsigned char *src, unsigned char *dst, long samples)
+{
+  long n = samples;
+  while (n--)
+    {
+      dst[0] = src[2];
+      dst[1] = src[1];
+      dst[2] = src[0];
+      dst[3] = src[0];
+      src+=3;
+      dst+=4;
+    }
+  return samples;
+}
+
+static inline long
+conv_rgbA8_premul_cairo32_le (unsigned char *src, unsigned char *dst, long samples)
+{
+  long n = samples;
+  while (n--)
+    {
+      dst[0] = src[2];
+      dst[1] = src[1];
+      dst[2] = src[0];
+      dst[3] = src[3];
+      src+=4;
+      dst+=4;
+    }
+  return samples;
+}
+
+static inline long
+conv_rgbA8_cairo32_le (unsigned char *src, unsigned char *dst, long samples)
+{
+  long n = samples;
+  while (n--)
+    {
+#define div_255(a) ((((a)+127)+(((a)+127)>>8))>>8)
+      dst[0] = div_255 (src[2] * src[3]);
+      dst[1] = div_255 (src[1] * src[3]);
+      dst[2] = div_255 (src[0] * src[3]);
+#undef div_255
+      dst[3] = src[3];
+      src+=4;
+      dst+=4;
+    }
+  return samples;
+}
+
+static inline unsigned char
+conv_rgbafloat_cairo32_map (float value,
+                            float alpha)
+{
+  unsigned short index;
+  float result;
+  if (value < 0.0)
+    return 0;
+  else if (value > 1.0)
+    return 0xFF;
+  index = (unsigned short)(value * 0xFFFF);
+  result = linear_to_gamma16[index] / 257.0; /* 65535.0 / 255.0 */
+
+  return (result * alpha) + 0.5f;
+}
+
+static long
+conv_rgbafloat_cairo32_le (unsigned char *src_char,
+                           unsigned char *dst,
+                           long           samples)
+{
+  long   n   = samples;
+  float *src = (float*)src_char;
+
+  while (n--)
+    {
+      if (src[3] < BABL_ALPHA_THRESHOLD)
+        {
+          *(int *)dst = 0;
+        }
+      else
+        {
+          if (src[3] >= 1.0)
+            {
+              dst[0] = conv_rgbafloat_cairo32_map (src[2], 1.0f);
+              dst[1] = conv_rgbafloat_cairo32_map (src[1], 1.0f);
+              dst[2] = conv_rgbafloat_cairo32_map (src[0], 1.0f);
+              dst[3] = 0xFF;
+            }
+          else
+            {
+              dst[0] = conv_rgbafloat_cairo32_map (src[2], src[3]);
+              dst[1] = conv_rgbafloat_cairo32_map (src[1], src[3]);
+              dst[2] = conv_rgbafloat_cairo32_map (src[0], src[3]);
+              dst[3] = src[3] * 0xFF + 0.5f;
+            }
+        }
+
+      src += 4;
+      dst += 4;
+    }
+  return samples;
+}
+
 int
 init (void)
 {
@@ -30,7 +153,7 @@ init (void)
 
   if (littleendian)
     {
-      babl_format_new (
+      const Babl *f32 = babl_format_new (
         "name", "cairo-ARGB32",
         babl_model ("R'aG'aB'aA"),
         babl_type ("u8"),
@@ -41,7 +164,7 @@ init (void)
         NULL
       );
 
-      babl_format_new (
+      const Babl *f24 = babl_format_new (
         "name", "cairo-RGB24",
         babl_model ("R'G'B'"),
         babl_type ("u8"),
@@ -51,12 +174,25 @@ init (void)
         babl_component ("PAD"),
         NULL
       );
+
+      babl_conversion_new (babl_format ("R'aG'aB'aA u8"), f32, "linear", 
+                           conv_rgbA8_premul_cairo32_le, NULL);
+      babl_conversion_new (babl_format ("R'G'B'A u8"), f32, "linear",
+                           conv_rgbA8_cairo32_le, NULL);
+
+      babl_conversion_new (babl_format ("RGBA float"), f32, "linear",
+                           conv_rgbafloat_cairo32_le, NULL);
+
+      babl_conversion_new (babl_format ("R'G'B'A u8"), f24, "linear", 
+                           conv_rgba8_cairo24_le, NULL);
+      babl_conversion_new (babl_format ("R'G'B' u8"), f24, "linear", 
+                           conv_rgb8_cairo24_le, NULL);
     }
   else
     {
       babl_format_new (
         "name", "cairo-ARGB32",
-        babl_model ("R'G'B'A"),
+        babl_model ("R'aG'aB'aA"),
         babl_type ("u8"),
         babl_component ("A"),
         babl_component ("R'a"),
index 067d4e93f986e8a317cb2ded2648b94486b04eb8..5cbbeb6517b75bd3f1581e0e8d7165c792ddeafa 100644 (file)
@@ -41,9 +41,9 @@ conv_rgbaF_linear_rgbAF_gamma (unsigned char *src,
    while (n--)
      {
        float alpha = fsrc[3];
-       *fdst++ = linear_to_gamma_2_2 (*fsrc++) * alpha;
-       *fdst++ = linear_to_gamma_2_2 (*fsrc++) * alpha;
-       *fdst++ = linear_to_gamma_2_2 (*fsrc++) * alpha;
+       *fdst++ = babl_linear_to_gamma_2_2 (*fsrc++) * alpha;
+       *fdst++ = babl_linear_to_gamma_2_2 (*fsrc++) * alpha;
+       *fdst++ = babl_linear_to_gamma_2_2 (*fsrc++) * alpha;
        *fdst++ = *fsrc++;
      }
   return samples;
@@ -71,17 +71,17 @@ conv_rgbAF_linear_rgbAF_gamma (unsigned char *src,
          }
        else if (alpha >= 1.0)
          {
-           *fdst++ = linear_to_gamma_2_2 (*fsrc++);
-           *fdst++ = linear_to_gamma_2_2 (*fsrc++);
-           *fdst++ = linear_to_gamma_2_2 (*fsrc++);
+           *fdst++ = babl_linear_to_gamma_2_2 (*fsrc++);
+           *fdst++ = babl_linear_to_gamma_2_2 (*fsrc++);
+           *fdst++ = babl_linear_to_gamma_2_2 (*fsrc++);
            *fdst++ = *fsrc++;
          }
        else
          {
            float alpha_recip = 1.0 / alpha;
-           *fdst++ = linear_to_gamma_2_2 (*fsrc++ * alpha_recip) * alpha;
-           *fdst++ = linear_to_gamma_2_2 (*fsrc++ * alpha_recip) * alpha;
-           *fdst++ = linear_to_gamma_2_2 (*fsrc++ * alpha_recip) * alpha;
+           *fdst++ = babl_linear_to_gamma_2_2 (*fsrc++ * alpha_recip) * alpha;
+           *fdst++ = babl_linear_to_gamma_2_2 (*fsrc++ * alpha_recip) * alpha;
+           *fdst++ = babl_linear_to_gamma_2_2 (*fsrc++ * alpha_recip) * alpha;
            *fdst++ = *fsrc++;
          }
      }
@@ -99,9 +99,9 @@ conv_rgbaF_linear_rgbaF_gamma (unsigned char *src,
 
    while (n--)
      {
-       *fdst++ = linear_to_gamma_2_2 (*fsrc++);
-       *fdst++ = linear_to_gamma_2_2 (*fsrc++);
-       *fdst++ = linear_to_gamma_2_2 (*fsrc++);
+       *fdst++ = babl_linear_to_gamma_2_2 (*fsrc++);
+       *fdst++ = babl_linear_to_gamma_2_2 (*fsrc++);
+       *fdst++ = babl_linear_to_gamma_2_2 (*fsrc++);
        *fdst++ = *fsrc++;
      }
   return samples;
@@ -118,9 +118,9 @@ conv_rgbF_linear_rgbF_gamma (unsigned char *src,
 
    while (n--)
      {
-       *fdst++ = linear_to_gamma_2_2 (*fsrc++);
-       *fdst++ = linear_to_gamma_2_2 (*fsrc++);
-       *fdst++ = linear_to_gamma_2_2 (*fsrc++);
+       *fdst++ = babl_linear_to_gamma_2_2 (*fsrc++);
+       *fdst++ = babl_linear_to_gamma_2_2 (*fsrc++);
+       *fdst++ = babl_linear_to_gamma_2_2 (*fsrc++);
      }
   return samples;
 }
@@ -137,9 +137,9 @@ conv_rgbaF_gamma_rgbaF_linear (unsigned char *src,
 
    while (n--)
      {
-       *fdst++ = gamma_2_2_to_linear (*fsrc++);
-       *fdst++ = gamma_2_2_to_linear (*fsrc++);
-       *fdst++ = gamma_2_2_to_linear (*fsrc++);
+       *fdst++ = babl_gamma_2_2_to_linear (*fsrc++);
+       *fdst++ = babl_gamma_2_2_to_linear (*fsrc++);
+       *fdst++ = babl_gamma_2_2_to_linear (*fsrc++);
        *fdst++ = *fsrc++;
      }
   return samples;
@@ -156,9 +156,9 @@ conv_rgbF_gamma_rgbF_linear (unsigned char *src,
 
    while (n--)
      {
-       *fdst++ = gamma_2_2_to_linear (*fsrc++);
-       *fdst++ = gamma_2_2_to_linear (*fsrc++);
-       *fdst++ = gamma_2_2_to_linear (*fsrc++);
+       *fdst++ = babl_gamma_2_2_to_linear (*fsrc++);
+       *fdst++ = babl_gamma_2_2_to_linear (*fsrc++);
+       *fdst++ = babl_gamma_2_2_to_linear (*fsrc++);
      }
   return samples;
 }
index c0919c9d8945c60b91d58c218154eb202e6198bc..c1f91caf05fcef257129556004ec98ae35a586ff 100644 (file)
@@ -40,6 +40,7 @@
  */
 
 #include <stdlib.h>
+#include <stdint.h>
 
 #include "config.h"
 #include "babl.h"
@@ -54,8 +55,8 @@
 
 static float         table_8_F[1 << 8];
 static float         table_8g_F[1 << 8];
-static unsigned char table_F_8[1 << 16];
-static unsigned char table_F_8g[1 << 16];
+static unsigned char table_F_8[1 << 17];
+static unsigned char table_F_8g[1 << 17];
 
 static int           table_inited = 0;
 
@@ -80,51 +81,55 @@ table_init (void)
   {
     union
     {
-      float          f;
-      unsigned short s[2];
+      float    f;
+      uint32_t s;
     } u;
     u.f = 0.0;
 
-    u.s[0] = 0.0;
+    //u.s[0] = 0;
 
-    for (u.s[1] = 0; u.s[1] < 65535; u.s[1] += 1)
+    for (u.s = 0; u.s < 4294900000U; u.s += 32768)
       {
-        unsigned char c;
-        unsigned char cg;
+        int c;
+        int cg;
 
         if (u.f <= 0.0)
           {
             c  = 0;
             cg = 0;
           }
-        else if (u.f >= 1.0)
-          {
-            c  = 255;
-            cg = 255;
-          }
         else
           {
-            c  = rint (u.f * 255.0);
-            cg = rint (linear_to_gamma_2_2 (u.f) * 255.0);
+            c  = (u.f * 255.1619) + 0.5;
+            cg = (linear_to_gamma_2_2 (u.f) * 255.1619) + 0.5;
+            if (cg > 255) cg = 255;
+            if (c > 255) c = 255;
           }
 
-        table_F_8[u.s[1]]  = c;
-        table_F_8g[u.s[1]] = cg;
+        table_F_8[(u.s >> 15) & ((1 << 17)-1)]  = c;
+        table_F_8g[(u.s >> 15) & ((1 << 17)-1)] = cg;
       }
   }
+#if 0
   /* fix tables to ensure 1:1 conversions back and forth */
   if (0)
     {
       int i;
       for (i = 0; i < 256; i++)
         {
-          float           f  = table_8_F[i];
+          float           f;
           unsigned short *hi = ((unsigned short *) (void *) &f);
           unsigned short *lo = ((unsigned short *) (void *) &f);
+
+          f = table_8_F[i];
           *lo              = 0;
-          table_F_8[(*hi)] = i;
+          table_F_8[*hi] = i;
+          f  = table_8g_F[i];
+          *lo              = 0;
+          table_F_8g[*hi] = i;
         }
     }
+#endif
 }
 
 /* function to find the index in table for a float */
@@ -134,10 +139,10 @@ gggl_float_to_index16 (float f)
   union
   {
     float          f;
-    unsigned short s[2];
+    uint32_t       s;
   } u;
   u.f = f;
-  return u.s[1];
+  return (u.s >> 15) & ((1 << 17)-1);
 }
 
 static INLINE long
@@ -460,6 +465,8 @@ conv_rgbAF_lrgba8 (unsigned char *srcc,
 }
 
 #define conv_rgb8_rgbAF    conv_rgb8_rgbaF
+#define conv_gamma_rgbaF_gamma_rgbAF   conv_rgbaF_rgbAF
+#define conv_gamma_rgbAF_gamma_rgbaF   conv_rgbAF_rgbaF
 
 int init (void);
 
@@ -482,6 +489,24 @@ init (void)
     babl_component ("Ba"),
     babl_component ("A"),
     NULL);
+    
+    
+  const Babl *gamma_rgbaF = babl_format_new (
+    babl_model ("R'G'B'A"),
+    babl_type ("float"),
+    babl_component ("R'"),
+    babl_component ("G'"),
+    babl_component ("B'"),
+    babl_component ("A"),
+    NULL);
+  const Babl *gamma_rgbAF = babl_format_new (
+    babl_model ("R'aG'aB'aA"),
+    babl_type ("float"),
+    babl_component ("R'a"),
+    babl_component ("G'a"),
+    babl_component ("B'a"),
+    babl_component ("A"),
+    NULL);
 
   const Babl *lrgba8 = babl_format_new (
     babl_model ("RGBA"),
@@ -524,6 +549,10 @@ init (void)
 
   o (rgbaF, rgbAF);
   o (rgbAF, rgbaF);
+  
+  o (gamma_rgbaF, gamma_rgbAF);
+  o (gamma_rgbAF, gamma_rgbaF);
+  
   o (rgbAF, lrgba8);
   o (rgb8, rgbaF);
   o (rgb8, rgbAF);
index e3c0029fd46299a95f158382b50519637b26a6bd..91304d65656ef659879fb90ca83926b0e555dfd2 100644 (file)
@@ -23,6 +23,8 @@
  *  Copyright 2003, 2004, 2005 Øyvind Kolås <pippin@gimp.org>
  */
 
+#define _POSIX_C_SOURCE 200112L
+
 #include "config.h"
 #include <math.h>
 #include <string.h>
 #include "babl.h"
 #include "extensions/util.h"
 
-
-#define INLINE    inline
-
-
 /*
  * Implemented according to information read from:
  *
@@ -92,7 +90,7 @@ table_init (void)
     } u;
     u.f = 0.0;
 
-    u.s[0] = 0.0;
+    u.s[0] = 0x8000;
 
     for (i = 0; i < 1 << 16; i++)
       {
@@ -113,8 +111,8 @@ table_init (void)
           }
         else
           {
-            c = rint (u.f * 255.0);
-            s = rint (u.f * 65535.0);
+            c = lrint (u.f * 255.0);
+            s = lrint (u.f * 65535.0);
           }
 
         /*fprintf (stderr, "%2.3f=%03i %05i ", f, c, (*hi));
@@ -154,7 +152,7 @@ gggl_float_to_index16 (float f)
 }
 
 
-static INLINE long
+static long
 conv_F_8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -171,7 +169,7 @@ conv_F_8 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_F_16 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -188,7 +186,7 @@ conv_F_16 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_8_F (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -204,7 +202,7 @@ conv_8_F (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_16_F (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -222,7 +220,7 @@ conv_16_F (unsigned char *src, unsigned char *dst, long samples)
 
 #else
 
-static INLINE long
+static long
 conv_F_8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -240,7 +238,7 @@ conv_F_8 (unsigned char *src, unsigned char *dst, long samples)
         }
       else
         {
-          *(unsigned char *) dst = rint (f * 255.0);
+          *(unsigned char *) dst = lrint (f * 255.0);
         }
       dst += 1;
       src += 4;
@@ -248,7 +246,7 @@ conv_F_8 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_F_16 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -266,7 +264,7 @@ conv_F_16 (unsigned char *src, unsigned char *dst, long samples)
         }
       else
         {
-          *(unsigned short *) dst = rint (f * 65535.0);
+          *(unsigned short *) dst = lrint (f * 65535.0);
         }
       dst += 2;
       src += 4;
@@ -276,7 +274,7 @@ conv_F_16 (unsigned char *src, unsigned char *dst, long samples)
 
 
 
-static INLINE long
+static long
 conv_8_F (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -290,7 +288,7 @@ conv_8_F (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_16_F (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -307,7 +305,7 @@ conv_16_F (unsigned char *src, unsigned char *dst, long samples)
 
 #endif
 
-static INLINE long
+static long
 conv_F_D (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -322,7 +320,7 @@ conv_F_D (unsigned char *src, unsigned char *dst, long samples)
 }
 
 
-static INLINE long
+static long
 conv_D_F (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -335,28 +333,29 @@ conv_D_F (unsigned char *src, unsigned char *dst, long samples)
     }
   return samples;
 }
-static INLINE long
+static long
 conv_16_8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
 
   while (n--)
     {
-      (*(unsigned char *) dst) = (*(unsigned short *) src) >> 8;
+#define div_257(a) ((((a)+128)-(((a)+128)>>8))>>8)
+      (*(unsigned char *) dst) = div_257 (*(unsigned short *) src);
       dst                     += 1;
       src                     += 2;
     }
   return samples;
 }
 
-static INLINE long
+static long
 conv_8_16 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
 
   while (n--)
     {
-      (*(unsigned short *) dst) = (*(unsigned char *) src) << 8;
+      (*(unsigned short *) dst) = ((*(unsigned char *) src) << 8) | *src;
       dst                      += 2;
       src                      += 1;
     }
@@ -364,7 +363,7 @@ conv_8_16 (unsigned char *src, unsigned char *dst, long samples)
 }
 
 /*********/
-static INLINE long
+static long
 conv_rgbaF_rgba8 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_F_8 (src, dst, samples * 4);
@@ -373,14 +372,14 @@ conv_rgbaF_rgba8 (unsigned char *src, unsigned char *dst, long samples)
 
 #define conv_rgbaF_rgbP8    conv_rgbaF_rgba8
 
-static INLINE long
+static long
 conv_rgbF_rgb8 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_F_8 (src, dst, samples * 3);
   return samples;
 }
 
-static INLINE long
+static long
 conv_gaF_ga8 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_F_8 (src, dst, samples * 2);
@@ -391,35 +390,35 @@ conv_gaF_ga8 (unsigned char *src, unsigned char *dst, long samples)
 #define conv_gF_g8          conv_F_8
 #define conv_gAF_gA8        conv_gaF_ga8
 
-static INLINE long
+static long
 conv_rgbaF_rgba16 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_F_16 (src, dst, samples * 4);
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgbaF_rgbaD (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_F_D (src, dst, samples * 4);
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgbaD_rgbaF (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_D_F (src, dst, samples * 4);
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgbF_rgb16 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_F_16 (src, dst, samples * 3);
   return samples;
 }
 
-static INLINE long
+static long
 conv_gaF_ga16 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_F_16 (src, dst, samples * 2);
@@ -432,21 +431,21 @@ conv_gaF_ga16 (unsigned char *src, unsigned char *dst, long samples)
 #define conv_gF_g16          conv_F_16
 #define conv_gAF_gA16        conv_gaF_ga16
 
-static INLINE long
+static long
 conv_rgba8_rgbaF (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_8_F (src, dst, samples * 4);
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgb8_rgbF (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_8_F (src, dst, samples * 3);
   return samples;
 }
 
-static INLINE long
+static long
 conv_ga8_gaF (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_8_F (src, dst, samples * 2);
@@ -457,21 +456,21 @@ conv_ga8_gaF (unsigned char *src, unsigned char *dst, long samples)
 #define conv_gA8_gAF        conv_ga8_gaF
 #define conv_g8_gF          conv_8_F
 
-static INLINE long
+static long
 conv_rgba16_rgbaF (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_16_F (src, dst, samples * 4);
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgb16_rgbF (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_16_F (src, dst, samples * 3);
   return samples;
 }
 
-static INLINE long
+static long
 conv_ga16_gaF (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_16_F (src, dst, samples * 2);
@@ -482,21 +481,21 @@ conv_ga16_gaF (unsigned char *src, unsigned char *dst, long samples)
 #define conv_gA16_gAF        conv_ga16_gaF
 #define conv_g16_gF          conv_16_F
 
-static INLINE long
+static long
 conv_rgba16_rgba8 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_16_8 (src, dst, samples * 4);
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgb16_rgb8 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_16_8 (src, dst, samples * 3);
   return samples;
 }
 
-static INLINE long
+static long
 conv_ga16_ga8 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_16_8 (src, dst, samples * 2);
@@ -507,21 +506,21 @@ conv_ga16_ga8 (unsigned char *src, unsigned char *dst, long samples)
 #define conv_gA16_gA8        conv_ga16_ga8
 #define conv_g16_g8          conv_16_8
 
-static INLINE long
+static long
 conv_rgba8_rgba16 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_8_16 (src, dst, samples * 4);
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgb8_rgb16 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_8_16 (src, dst, samples * 3);
   return samples;
 }
 
-static INLINE long
+static long
 conv_ga8_ga16 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_8_16 (src, dst, samples * 2);
@@ -534,7 +533,7 @@ conv_ga8_ga16 (unsigned char *src, unsigned char *dst, long samples)
 
 /* alpha conversions */
 
-static INLINE long
+static long
 conv_gaF_gAF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -553,7 +552,7 @@ conv_gaF_gAF (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_gAF_gaF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -572,96 +571,9 @@ conv_gAF_gaF (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
-conv_rgbAF_rgbaF (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      float alpha = (*(float *) (src + 4 * 3));
-      int   c;
-      if (alpha >= 1.0)
-        {
-          for (c = 0; c < 3; c++)
-            {
-              *(float *) dst = *(float *) src;
-              dst           += 4;
-              src           += 4;
-            }
-        }
-      else if (alpha <= 0.0)
-        {
-          for (c = 0; c < 3; c++)
-            {
-              *(float *) dst = 0;
-              dst           += 4;
-              src           += 4;
-            }
-        }
-      else
-        {
-          for (c = 0; c < 3; c++)
-            {
-              *(float *) dst = ((*(float *) src) / alpha);
-              dst           += 4;
-              src           += 4;
-            }
-        }
-      *(float *) dst = alpha;
-      dst           += 4;
-      src           += 4;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_rgbaF_rgbAF (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      float alpha = (*(float *) (src + 4 * 3));
-      int   c;
-
-      if (alpha >= 1.0)
-        {
-          for (c = 0; c < 3; c++)
-            {
-              *(float *) dst = *(float *) src;
-              dst           += 4;
-              src           += 4;
-            }
-        }
-      else if (alpha <= 0.0)
-        {
-          for (c = 0; c < 3; c++)
-            {
-              *(float *) dst = 0;
-              dst           += 4;
-              src           += 4;
-            }
-        }
-      else
-        {
-          for (c = 0; c < 3; c++)
-            {
-              *(float *) dst = ((*(float *) src) * alpha);
-              dst           += 4;
-              src           += 4;
-            }
-        }
-      *(float *) dst = alpha;
-      dst           += 4;
-      src           += 4;
-    }
-  return samples;
-}
-
 /* alpha stripping and adding */
 
-static INLINE long
+static long
 conv_rgbaF_rgbF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -682,7 +594,7 @@ conv_rgbaF_rgbF (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgbF_rgbaF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -704,7 +616,7 @@ conv_rgbF_rgbaF (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_gaF_gF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -719,7 +631,7 @@ conv_gaF_gF (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_gF_gaF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -741,7 +653,7 @@ conv_gF_gaF (unsigned char *src, unsigned char *dst, long samples)
 
 /* colorchannel dropping and adding */
 
-static INLINE long
+static long
 conv_gF_rgbF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -760,29 +672,7 @@ conv_gF_rgbF (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
-conv_rgbF_gF (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      int   c;
-      float sum = 0;
-
-      for (c = 0; c < 3; c++)
-        {
-          sum += (*(float *) src);
-          src += 4;
-        }
-      sum             /= 3;
-      (*(float *) dst) = sum;
-      dst             += 4;
-    }
-  return samples;
-}
-
-static INLINE long
+static long
 conv_gaF_rgbaF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -804,36 +694,11 @@ conv_gaF_rgbaF (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
-conv_rgbaF_gaF (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      int   c;
-      float sum = 0;
-
-      for (c = 0; c < 3; c++)
-        {
-          sum += (*(float *) src);
-          src += 4;
-        }
-      (*(float *) dst) = sum / 3;
-      dst             += 4;
-      (*(int *) dst)   = (*(int *) src);
-      dst             += 4;
-      src             += 4;
-    }
-  return samples;
-}
-
 #define conv_gAF_rgbAF    conv_gaF_rgbaF
-#define conv_rgbAF_gAF    conv_rgbaF_gaF
 
 /* other conversions coded for some optimisation reason or sumthin */
 
-static INLINE long
+static long
 conv_rgbaF_rgbA8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -845,18 +710,18 @@ conv_rgbaF_rgbA8 (unsigned char *src, unsigned char *dst, long samples)
 
       for (c = 0; c < 3; c++)
         {
-          *(unsigned char *) dst = ((*(float *) src) * alpha) * 255.0;
+          *(unsigned char *) dst = lrint (((*(float *) src) * alpha) * 255.0);
           dst                   += 1;
           src                   += 4;
         }
-      *(unsigned char *) dst = alpha * 255.0;
+      *(unsigned char *) dst = lrint (alpha * 255.0);
       dst++;
       src += 4;
     }
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgbaF_rgb8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -867,7 +732,7 @@ conv_rgbaF_rgb8 (unsigned char *src, unsigned char *dst, long samples)
 
       for (c = 0; c < 3; c++)
         {
-          *(unsigned char *) dst = (*(float *) src) * 255.0;
+          *(unsigned char *) dst = lrint ((*(float *) src) * 255.0);
           dst                   += 1;
           src                   += 4;
         }
@@ -876,29 +741,7 @@ conv_rgbaF_rgb8 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
-conv_rgbaF_g8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      int   c;
-      float sum = 0;
-
-      for (c = 0; c < 3; c++)
-        {
-          sum += (*(float *) src);
-          src += 4;
-        }
-      *(unsigned char *) dst = sum * 255.0 / 3;
-      dst++;
-      src += 4;
-    }
-  return samples;
-}
-
-static INLINE long
+static long
 conv_rgbaF_rgb16 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -909,7 +752,7 @@ conv_rgbaF_rgb16 (unsigned char *src, unsigned char *dst, long samples)
 
       for (c = 0; c < 3; c++)
         {
-          *(unsigned short *) dst = (*(float *) src) * 65535.0;
+          *(unsigned short *) dst = lrint ((*(float *) src) * 65535.0);
           dst                    += 2;
           src                    += 4;
         }
@@ -918,135 +761,7 @@ conv_rgbaF_rgb16 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
-conv_rgbP8_rgbaF (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      int c;
-
-      for (c = 0; c < 3; c++)
-        {
-          (*(float *) dst) = *(unsigned char *) src / 255.0;
-          dst             += 4;
-          src             += 1;
-        }
-      (*(float *) dst) = 1.0;
-      dst             += 4;
-      src             += 1;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_rgbA16_rgbaF (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      float alpha = (*(unsigned short *) src + (3)) / 65535.0;
-      int   c;
-
-      for (c = 0; c < 3; c++)
-        {
-          (*(float *) dst) = (*(unsigned short *) src / 65535.0) / alpha;
-          dst             += 4;
-          src             += 2;
-        }
-      *(float *) dst = alpha;
-      dst           += 4;
-      src           += 2;
-    }
-  return samples;
-}
-
-/*
-   static INLINE long
-   conv_rgb8_rgbaF (unsigned char *src,
-                 unsigned char *dst,
-                 int samples)
-   {
-    long n=samples;
-    while (n--) {
-        int c;
-
-        for (c = 0; c < 3; c++) {
-            (*(float *) dst) = *(unsigned char *) src / 255.0;
-            dst += 4;
-            src += 1;
-        }
-        (*(float *) dst) = 1.0;
-        dst += 4;
-    }
-   return samples;
-   }
-
-   static INLINE long
-   conv_g8_rgbaF (unsigned char *src,
-               unsigned char *dst,
-               int samples)
-   {
-    long n=samples;
-    while (n--) {
-        int c;
-
-        for (c = 0; c < 3; c++) {
-            (*(float *) dst) = *(unsigned char *) src / 255.0;
-            dst += 4;
-        }
-        src += 1;
-        (*(float *) dst) = 1.0;
-        dst += 4;
-    }
-   return samples;
-   }
-
-   static INLINE long
-   conv_rgb16_rgbaF (unsigned char *src,
-                  unsigned char *dst,
-                  int samples)
-   {
-    long n=samples;
-    while (n--) {
-        int c;
-
-        for (c = 0; c < 3; c++) {
- *(float *) dst = (*(unsigned short *) src) / 65535.0;
-            src += 2;
-            dst += 4;
-        }
- *(float *) dst = 1.0;
-        src += 2;
-        dst += 4;
-    }
-   return samples;
-   }
-
-   static INLINE long
-   conv_gF_rgbaF (unsigned char *src,
-               unsigned char *dst,
-               int samples)
-   {
-    long n=samples;
-    while (n--) {
-        (*(float *) dst) = (*(float *) src);
-        dst += 4;
-        (*(float *) dst) = (*(float *) src);
-        dst += 4;
-        (*(float *) dst) = (*(float *) src);
-        dst += 4;
-        (*(float *) dst) = 1.0;
-        dst += 4;
-        src += 4;
-
-    }
-   return samples;
-   }
- */
-static INLINE long
+static long
 conv_rgba8_rgbA8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -1063,9 +778,10 @@ conv_rgba8_rgbA8 (unsigned char *src, unsigned char *dst, long samples)
         }
       else
         {
-          dst[0] = (src[0] * src[3]) >> 8;      /* FIXME: check if this faster */
-          dst[1] = (src[1] * src[3]) >> 8;      /*        version (>>8 vs /255) */
-          dst[2] = (src[2] * src[3]) >> 8;      /*        is accurate enough   */
+#define div_255(a) ((((a)+127)+(((a)+127)>>8))>>8)
+          dst[0] = div_255 (src[0] * src[3]);
+          dst[1] = div_255 (src[1] * src[3]);
+          dst[2] = div_255 (src[2] * src[3]);
           dst[3] = src[3];
         }
       dst += 4;
@@ -1074,7 +790,7 @@ conv_rgba8_rgbA8 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgbA8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -1093,10 +809,10 @@ conv_rgbA8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
         }
       else
         {
-          unsigned int aa = (255 << 16) / src[3];
-          *dst++ = (src[0] * aa) >> 16;
-          *dst++ = (src[1] * aa) >> 16;
-          *dst++ = (src[2] * aa) >> 16;
+          unsigned int aa = ((255 << 16) + (src[3] >> 1)) / src[3];
+          *dst++ = (src[0] * aa + 0x8000) >> 16;
+          *dst++ = (src[1] * aa + 0x8000) >> 16;
+          *dst++ = (src[2] * aa + 0x8000) >> 16;
           *dst++ = src[3];
         }
       src += 4;
@@ -1104,161 +820,7 @@ conv_rgbA8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
-conv_argb8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[2];
-      dst[1] = src[1];
-      dst[2] = src[0];
-      dst[3] = src[3];
-      src   += 4;
-      dst   += 4;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_rgba8_argb8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[3];
-      dst[1] = src[0];
-      dst[2] = src[1];
-      dst[3] = src[2];
-      src   += 4;
-      dst   += 4;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_Argb8_rgbA8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[2];
-      dst[1] = src[1];
-      dst[2] = src[0];
-      dst[3] = src[3];
-      src   += 4;
-      dst   += 4;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_rgbA8_Argb8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[2];
-      dst[1] = src[1];
-      dst[2] = src[0];
-      dst[3] = src[3];
-      src   += 4;
-      dst   += 4;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_Prgb8_rgbP8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[2];
-      dst[1] = src[1];
-      dst[2] = src[0];
-      dst[3] = 255;
-      src   += 4;
-      dst   += 4;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_rgbP8_Prgb8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[2];
-      dst[1] = src[1];
-      dst[2] = src[0];
-      dst[3] = 255;
-      src   += 4;
-      dst   += 4;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_Prgb8_rgb8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[2];
-      dst[1] = src[1];
-      dst[2] = src[0];
-      /*dst[3] = src[3]; */
-      src += 4;
-      dst += 3;
-    }
-  return samples;
-}
-
-
-/* FIXME: this is actually BGRP */
-static INLINE long
-conv_rgb8_Prgb8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[2];          /* blue */
-      dst[1] = src[1];          /* green */
-      dst[2] = src[0];          /* red */
-      dst[3] = 255;
-      src   += 3;
-      dst   += 4;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_rgb8_rgbP8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[0];
-      dst[1] = src[1];
-      dst[2] = src[2];
-      src   += 3;
-      dst   += 4;
-    }
-  return samples;
-}
-
-static INLINE long
+static long
 conv_rgb8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -1278,49 +840,7 @@ conv_rgb8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
 
 #define conv_rgb8_rgbA8    conv_rgb8_rgba8
 
-static INLINE long
-conv_rgbP8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      *(unsigned int *) dst = *(unsigned int *) src;
-      dst[3]                = 255;
-      src                  += 4;
-      dst                  += 4;
-    }
-  return samples;
-}
-
-#define conv_rgbP8_rgbA8    conv_rgbP8_rgba8
-
-static INLINE long
-conv_rgba8_rgbP8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  memcpy (dst, src, samples * 4);
-  return samples;
-}
-
-#define conv_rgbA8_rgbP8    conv_rgba8_rgbP8
-
-static INLINE long
-conv_rgbP8_rgb8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[0];
-      dst[1] = src[1];
-      dst[2] = src[2];
-      src   += 4;
-      dst   += 3;
-    }
-  return samples;
-}
-
-static INLINE long
+static long
 conv_rgba8_rgb8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -1336,225 +856,6 @@ conv_rgba8_rgb8 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-#ifndef byteclamp
-#define byteclamp(j)                   do { if (j < 0) j = 0;else if (j > 255) j = 255; } while (0)
-#endif
-
-#define YUV82RGB8(Y, U, V, R, G, B)    do { \
-      R = ((Y << 15) + 37355 * (V - 128)) >> 15; \
-      G = ((Y << 15) - 12911 * (U - 128) - 19038 * (V - 128)) >> 15; \
-      B = ((Y << 15) + 66454 * (U - 128)) >> 15; \
-      byteclamp (R); \
-      byteclamp (G); \
-      byteclamp (B); \
-    } while (0)
-
-#define RGB82YUV8(R, G, B, Y, U, V)    do { \
-      Y = ((9798 * R + 19234 * G + 3736 * B) >> 15) + 000; \
-      U = ((-4817 * R - 9470 * G + 14320 * B) >> 15) + 128; \
-      V = ((20152 * R - 16875 * G - 3277 * B) >> 15) + 128; \
-      byteclamp (Y); \
-      byteclamp (U); \
-      byteclamp (V); \
-    } while (0)
-
-/******* lab, xyz and rgb interaction, lifted from cpercep by adam d. moss */
-
-/*
-   static const double Xn = 0.951;
-   static const double Yn = 1.0;
-   static const double Zn = 1.089;
- */
-
-#define LXN    0.312713F
-#define LYN    0.329016F
-
-static const double lxn = LXN;
-static const double lyn = LYN;
-static double       xnn = LXN / LYN;
-static double       znn = (1.0F - (LXN + LYN)) / LYN;
-
-
-static const double LRAMP = 7.99959199F;
-
-static INLINE long
-conv_rgbF_xyzF (unsigned char *src, unsigned char *dst, long samples)
-{
-  float *src_f = (float *) src;
-  float *dst_f = (float *) dst;
-  long   n     = samples;
-
-  while (n--)
-    {
-      float x, y, z;
-      float red, green, blue;
-
-      red   = src_f[0];
-      green = src_f[1];
-      blue  = src_f[2];
-
-      x = 0.431 * red + 0.342 * green + 0.179 * blue;
-      y = 0.222 * red + 0.707 * green + 0.071 * blue;
-      z = 0.020 * red + 0.130 * green + 0.939 * blue;
-
-      dst_f[0] = x;
-      dst_f[1] = y;
-      dst_f[2] = z;
-      dst_f   += 3;
-      src_f   += 3;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_xyzF_rgbF (unsigned char *src, unsigned char *dst, long samples)
-{
-  float *src_f = (float *) src;
-  float *dst_f = (float *) dst;
-  long   n     = samples;
-
-  while (n--)
-    {
-      dst_f[0] = src_f[0];
-      dst_f[1] = src_f[1];
-      dst_f[2] = src_f[2];
-      dst_f   += 3;
-      src_f   += 3;
-    }
-  return samples;
-}
-
-static INLINE double
-ffunc (const double t)
-{
-  if (t > 0.008856F)
-    {
-      return (cbrt (t));
-    }
-  else
-    {
-      return (7.787F * t + 16.0F / 116.0F);
-    }
-}
-
-
-static INLINE double
-ffunc_inv (const double t)
-{
-  if (t > 0.206893F)
-    {
-      return (t * t * t);
-    }
-  else
-    {
-      return ((t - 16.0F / 116.0F) / 7.787F);
-    }
-}
-
-static INLINE long
-conv_labF_xyzF (unsigned char *src, unsigned char *dst, long samples)
-{
-  float *src_f = (float *) src;
-  float *dst_f = (float *) dst;
-  long   n     = samples;
-
-  while (n--)
-    {
-      float P;
-      float X, Y, Z;
-      float L, a, b;
-
-      L = src_f[0];
-      a = src_f[1];
-      b = src_f[2];
-
-      if (L > LRAMP)
-        {
-          P = Y = (L + 16.0F) / 116.0F;
-          Y = Y * Y * Y;
-        }
-      else
-        {
-          Y = L / 903.3F;
-          P = 7.787F * Y + 16.0F / 116.0F;
-        }
-
-      X = (P + a / 500.0F);
-      X = xnn *ffunc_inv (X);
-      Z = (P - b / 200.0F);
-      Z = znn *ffunc_inv (Z);
-
-
-      dst_f[0] = X;
-      dst_f[1] = Y;
-      dst_f[2] = Z;
-      dst_f   += 3;
-      src_f   += 3;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_xyzF_labF (unsigned char *src, unsigned char *dst, long samples)
-{
-  float *src_f = (float *) src;
-  float *dst_f = (float *) dst;
-  long   n     = samples;
-
-  while (n--)
-    {
-      double ffuncY;
-      float  X, Y, Z;
-      float  L, a, b;
-      X = src_f[0];
-      Y = src_f[1];
-      Z = src_f[2];
-
-      if (Y > 0.0F)
-        {
-          if (Y > 0.008856F)
-            {
-              L = (116.0F * cbrt (Y)) - 16.0F;
-            }
-          else
-            {
-              L = (Y * 903.3F);
-            }
-        }
-      else
-        {
-          L = 0.0;
-        }
-
-      ffuncY = ffunc (Y);
-      a      = 500.0F * (ffunc (X / xnn) - ffuncY);
-      b      = 200.0F * (ffuncY - ffunc (Z / znn));
-
-      dst_f[0] = L;
-      dst_f[1] = a;
-      dst_f[2] = b;
-      dst_f   += 3;
-      src_f   += 3;
-    }
-  return samples;
-}
-
-/******* end of cpercep lift out **/
-
-
-#define MAX_CONVERSIONS    100
-
-typedef struct Conversion
-{
-  int from_fmt;
-  int to_fmt;
-  int cost;               /* cost of function,. calculated as ms to convert 1024*1024 samples */
-  int loss;                     /* 0 maps ok, 1 precision loss, 2 alpha loss, 4 channel loss
-                                   (should be dwelled further into) */
-  void (*function)(unsigned char *src, unsigned char *dst, long samples);
-} Conversion;
-
-
 int init (void);
 
 int
@@ -1726,27 +1027,9 @@ init (void)
   o (g16, gF);
   o (ga16, ga8);
   o (g16, g8);
-  o (rgbaF, rgbAF);
-  o (rgbAF, rgbaF);
-  o (rgbA8, rgbA16);
-  o (rgb8, rgb16);
   o (ga8, ga16);
   o (gA8, gA16);
   o (g8, g16);
-  o (rgba8, rgbaF);
-  o (rgbA8, rgbAF);
-  o (rgb8, rgbF);
-  o (ga8, gaF);
-  o (gA8, gAF);
-  o (g8, gF);
-  o (rgba16, rgbaF);
-  o (rgbA16, rgbAF);
-  o (rgb16, rgbF);
-  o (ga16, gaF);
-  o (gA16, gAF);
-  o (g16, gF);
-  o (rgbaF, rgbAF);
-  o (rgbAF, rgbaF);
   o (gaF, gAF);
   o (gAF, gaF);
   o (rgbaF, rgbF);
@@ -1755,30 +1038,21 @@ init (void)
   o (rgbF, rgbAF);
   o (gF, gaF);
   o (gF, gAF);
-  o (rgbF, gF);
   o (gF, rgbF);
-  o (rgbaF, gaF);
   o (gaF, rgbaF);
-  o (rgbAF, gAF);
   o (gAF, rgbAF);
   o (rgbaF, rgb8);
-  o (rgbA8, rgbAF);
-  o (ga8, gaF);
-  o (gA8, gAF);
   o (rgbA8, rgba8);
   o (rgba8, rgbA8);
-  o (gAF, rgbAF);
-  o (rgbaF, g8);
   o (rgbaF, rgb16);
   o (rgb8, rgba8);
   o (rgb8, rgbA8);
   o (rgba8, rgb8);
   o (rgbaF, rgbA8);
-#if 0
-  o (rgbF, xyzF);
-  o (xyzF, rgbF);
-  o (labF, xyzF);
-  o (xyzF, labF);
+
+#ifdef USE_TABLES
+  if (!table_inited)
+    table_init ();
 #endif
 
   return 0;
index 6a007c6dca69ef6a29dfd87ab2b28ed08fa52051..e9fc1d9eff699409668c17b8b2fa1f04d6385f73 100644 (file)
  *  Copyright 2003, 2004, 2005 Øyvind Kolås <pippin@gimp.org>
  */
 
+#define _POSIX_C_SOURCE 200112L
+
 #include "config.h"
 #include <math.h>
 #include <string.h>
+#include <stdint.h>
 
 #include "babl.h"
 #include "extensions/util.h"
 
-
-#define INLINE    inline
-
 /*
  * Implemented according to information read from:
  *
@@ -59,6 +59,7 @@ static float          table_16_F[1 << 16];
 static unsigned char  table_F_8[1 << 16];
 static unsigned short table_F_16[1 << 16];
 
+static uint32_t      *table_8_F_int = NULL;
 
 static int table_inited = 0;
 
@@ -67,6 +68,9 @@ table_init (void)
 {
   if (table_inited)
     return;
+  
+  table_8_F_int = (void*)(table_8_F);
+
   table_inited = 1;
 
   /* fill tables for conversion from integer to float */
@@ -88,7 +92,7 @@ table_init (void)
     } u;
     u.f = 0.0;
 
-    u.s[0] = 0.0;
+    u.s[0] = 0x8000;
 
     for (u.s[1] = 0; u.s[1] < 65535; u.s[1] += 1)
       {
@@ -107,8 +111,8 @@ table_init (void)
           }
         else
           {
-            c = rint (u.f * 255.0);
-            s = rint (u.f * 65535.0);
+            c = lrint (u.f * 255.0);
+            s = lrint (u.f * 65535.0);
           }
 
         /*fprintf (stderr, "%2.3f=%03i %05i ", f, c, (*hi));
@@ -147,7 +151,7 @@ gggl_float_to_index16 (float f)
   return u.s[1];
 }
 
-static INLINE long
+static long
 conv_F_8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -164,7 +168,7 @@ conv_F_8 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_F_16 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -181,7 +185,7 @@ conv_F_16 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_8_F (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -190,14 +194,38 @@ conv_8_F (unsigned char *src, unsigned char *dst, long samples)
     table_init ();
   while (n--)
     {
-      (*(float *) dst) = table_8_F[*(unsigned char *) src];
+      (*(uint32_t *) dst) = table_8_F_int[*(unsigned char *) src];
+      dst             += 4;
+      src             += 1;
+    }
+  return samples;
+}
+
+static long
+conv_rgb8_rgbaF (unsigned char *src, unsigned char *dst, long samples)
+{
+  long n = samples;
+
+  if (!table_inited)
+    table_init ();
+  while (n--)
+    {
+      (*(uint32_t *) dst) = table_8_F_int[*(unsigned char *) src];
+      dst             += 4;
+      src             += 1;
+      (*(uint32_t *) dst) = table_8_F_int[*(unsigned char *) src];
       dst             += 4;
       src             += 1;
+      (*(uint32_t *) dst) = table_8_F_int[*(unsigned char *) src];
+      dst             += 4;
+      src             += 1;
+      (*(float    *) dst) = 1.0;
+      dst             += 4;
     }
   return samples;
 }
 
-static INLINE long
+static long
 conv_16_F (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -213,9 +241,36 @@ conv_16_F (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
+static long
+conv_rgbaF_rgb8 (unsigned char *src, unsigned char *dst, long samples)
+{
+  long n = samples;
+
+  while (n--)
+    {
+      register float f = (*(float *) src);
+      *(unsigned char *) dst = table_F_8[gggl_float_to_index16 (f)];
+      src                   += 4;
+      dst                   += 1;
+
+      f                      = (*(float *) src);
+      *(unsigned char *) dst = table_F_8[gggl_float_to_index16 (f)];
+      src                   += 4;
+      dst                   += 1;
+
+      f                      = (*(float *) src);
+      *(unsigned char *) dst = table_F_8[gggl_float_to_index16 (f)];
+      src                   += 4;
+      dst                   += 1;
+
+      src += 4;
+    }
+  return samples;
+}
+
 #else
 
-static INLINE long
+static long
 conv_F_8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -223,7 +278,7 @@ conv_F_8 (unsigned char *src, unsigned char *dst, long samples)
   while (n--)
     {
       float f    = ((*(float *) src));
-      int   uval = rint (f * 255.0);
+      int   uval = lrint (f * 255.0);
 
       if (uval < 0) uval = 0;
       if (uval > 255) uval = 255;
@@ -235,7 +290,7 @@ conv_F_8 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_F_16 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -253,7 +308,7 @@ conv_F_16 (unsigned char *src, unsigned char *dst, long samples)
         }
       else
         {
-          *(unsigned short *) dst = rint (f * 65535.0);
+          *(unsigned short *) dst = lrint (f * 65535.0);
         }
       dst += 2;
       src += 4;
@@ -261,7 +316,7 @@ conv_F_16 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_8_F (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -275,7 +330,7 @@ conv_8_F (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_16_F (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -289,11 +344,36 @@ conv_16_F (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
+static long
+conv_rgbaF_rgb8 (unsigned char *src, unsigned char *dst, long samples)
+{
+  long n = samples;
+
+  while (n--)
+    {
+      int c;
+
+      for (c = 0; c < 3; c++)
+        {
+          int val = rint ((*(float *) src) * 255.0);
+          if (val < 0)
+            *(unsigned char *) dst = 0;
+          else if (val > 255)
+            *(unsigned char *) dst = 255;
+          else
+            *(unsigned char *) dst = val;
+          dst += 1;
+          src += 4;
+        }
+      src += 4;
+    }
+  return samples;
+}
 
 #endif
 
 
-static INLINE long
+static long
 conv_F_D (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -307,7 +387,7 @@ conv_F_D (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_D_F (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -321,80 +401,52 @@ conv_D_F (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_16_8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
 
   while (n--)
     {
-      (*(unsigned char *) dst) = (*(unsigned short *) src) >> 8;
+#define div_257(a) ((((a)+128)-(((a)+128)>>8))>>8)
+      (*(unsigned char *) dst) = div_257 (*(unsigned short *) src);
       dst                     += 1;
       src                     += 2;
     }
   return samples;
 }
 
-static INLINE long
+static long
 conv_8_16 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
 
   while (n--)
     {
-      (*(unsigned short *) dst) = (*(unsigned char *) src) << 8;
+      (*(unsigned short *) dst) = ((*(unsigned char *) src) << 8) | *src;
       dst                      += 2;
       src                      += 1;
     }
   return samples;
 }
 
-static INLINE long
-conv_rgbaF_rgb8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      register float f = (*(float *) src);
-      *(unsigned char *) dst = table_F_8[gggl_float_to_index16 (f)];
-      src                   += 4;
-      dst                   += 1;
-
-      f                      = (*(float *) src);
-      *(unsigned char *) dst = table_F_8[gggl_float_to_index16 (f)];
-      src                   += 4;
-      dst                   += 1;
-
-      f                      = (*(float *) src);
-      *(unsigned char *) dst = table_F_8[gggl_float_to_index16 (f)];
-      src                   += 4;
-      dst                   += 1;
-
-      src += 4;
-    }
-  return samples;
-}
-
 
 /*********/
-static INLINE long
+static long
 conv_rgbaF_rgba8 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_F_8 (src, dst, samples * 4);
   return samples;
 }
 
-#define conv_rgbaF_rgbP8    conv_rgbaF_rgba8
-
-static INLINE long
+static long
 conv_rgbF_rgb8 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_F_8 (src, dst, samples * 3);
   return samples;
 }
 
-static INLINE long
+static long
 conv_gaF_ga8 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_F_8 (src, dst, samples * 2);
@@ -405,21 +457,21 @@ conv_gaF_ga8 (unsigned char *src, unsigned char *dst, long samples)
 #define conv_gF_g8          conv_F_8
 #define conv_gAF_gA8        conv_gaF_ga8
 
-static INLINE long
+static long
 conv_rgbaF_rgba16 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_F_16 (src, dst, samples * 4);
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgbF_rgb16 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_F_16 (src, dst, samples * 3);
   return samples;
 }
 
-static INLINE long
+static long
 conv_gaF_ga16 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_F_16 (src, dst, samples * 2);
@@ -430,19 +482,20 @@ conv_gaF_ga16 (unsigned char *src, unsigned char *dst, long samples)
 #define conv_gF_g16          conv_F_16
 #define conv_gAF_gA16        conv_gaF_ga16
 
-static INLINE long
+static long
 conv_rgba8_rgbaF (unsigned char *src, unsigned char *dst, long samples)
 {
   return conv_8_F (src, dst, samples * 4) / 4;
 }
 
-static INLINE long
+
+static long
 conv_rgb8_rgbF (unsigned char *src, unsigned char *dst, long samples)
 {
   return conv_8_F (src, dst, samples * 3) / 3;
 }
 
-static INLINE long
+static long
 conv_ga8_gaF (unsigned char *src, unsigned char *dst, long samples)
 {
   return conv_8_F (src, dst, samples * 2) / 2;
@@ -452,35 +505,35 @@ conv_ga8_gaF (unsigned char *src, unsigned char *dst, long samples)
 #define conv_gA8_gAF        conv_ga8_gaF
 #define conv_g8_gF          conv_8_F
 
-static INLINE long
+static long
 conv_rgbaF_rgbaD (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_F_D (src, dst, samples * 4);
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgbaD_rgbaF (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_D_F (src, dst, samples * 4);
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgba16_rgbaF (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_16_F (src, dst, samples * 4);
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgb16_rgbF (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_16_F (src, dst, samples * 3);
   return samples;
 }
 
-static INLINE long
+static long
 conv_ga16_gaF (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_16_F (src, dst, samples * 2);
@@ -491,21 +544,21 @@ conv_ga16_gaF (unsigned char *src, unsigned char *dst, long samples)
 #define conv_gA16_gAF        conv_ga16_gaF
 #define conv_g16_gF          conv_16_F
 
-static INLINE long
+static long
 conv_rgba16_rgba8 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_16_8 (src, dst, samples * 4);
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgb16_rgb8 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_16_8 (src, dst, samples * 3);
   return samples;
 }
 
-static INLINE long
+static long
 conv_ga16_ga8 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_16_8 (src, dst, samples * 2);
@@ -516,21 +569,21 @@ conv_ga16_ga8 (unsigned char *src, unsigned char *dst, long samples)
 #define conv_gA16_gA8        conv_ga16_ga8
 #define conv_g16_g8          conv_16_8
 
-static INLINE long
+static long
 conv_rgba8_rgba16 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_8_16 (src, dst, samples * 4);
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgb8_rgb16 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_8_16 (src, dst, samples * 3);
   return samples;
 }
 
-static INLINE long
+static long
 conv_ga8_ga16 (unsigned char *src, unsigned char *dst, long samples)
 {
   conv_8_16 (src, dst, samples * 2);
@@ -543,7 +596,7 @@ conv_ga8_ga16 (unsigned char *src, unsigned char *dst, long samples)
 
 /* alpha conversions */
 
-static INLINE long
+static long
 conv_gaF_gAF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -562,7 +615,7 @@ conv_gaF_gAF (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_gAF_gaF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -581,111 +634,22 @@ conv_gAF_gaF (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
-conv_rgbAF_rgbaF (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      float alpha = (((float *) src)[3]);
-      int   c;
-      if (alpha >= 1.0)
-        {
-          for (c = 0; c < 3; c++)
-            {
-              *(float *) dst = *(float *) src;
-              dst           += 4;
-              src           += 4;
-            }
-        }
-      else if (alpha <= 0.0)
-        {
-          for (c = 0; c < 3; c++)
-            {
-              *(float *) dst = 0;
-              dst           += 4;
-              src           += 4;
-            }
-        }
-      else
-        {
-          float alpha_recip = 1.0 / alpha;
-          for (c = 0; c < 3; c++)
-            {
-              *(float *) dst = ((*(float *) src) * alpha_recip);
-              dst           += 4;
-              src           += 4;
-            }
-        }
-      *(float *) dst = alpha;
-      dst           += 4;
-      src           += 4;
-    }
-  return samples;
-}
-
-
-static INLINE long
-conv_rgbaF_rgbAF (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      float alpha = (((float *) src)[3]);
-      int   c;
-
-      if (alpha >= 1.0)
-        {
-          for (c = 0; c < 3; c++)
-            {
-              *(float *) dst = *(float *) src;
-              dst           += 4;
-              src           += 4;
-            }
-        }
-      else if (alpha <= 0.0)
-        {
-          for (c = 0; c < 3; c++)
-            {
-              *(float *) dst = 0;
-              dst           += 4;
-              src           += 4;
-            }
-        }
-      else
-        {
-          for (c = 0; c < 3; c++)
-            {
-              *(float *) dst = ((*(float *) src) * alpha);
-              dst           += 4;
-              src           += 4;
-            }
-        }
-      *(float *) dst = alpha;
-      dst           += 4;
-      src           += 4;
-    }
-  return samples;
-}
-
 /* alpha stripping and adding */
 
-static INLINE long
+static long
 conv_rgbaF_rgbF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
 
   while (n--)
     {
-      *(float *) dst = (*(float *) src);
+      *(uint32_t *) dst = (*(uint32_t *) src);
       dst           += 4;
       src           += 4;
-      *(float *) dst = (*(float *) src);
+      *(uint32_t *) dst = (*(uint32_t *) src);
       dst           += 4;
       src           += 4;
-      *(float *) dst = (*(float *) src);
+      *(uint32_t *) dst = (*(uint32_t *) src);
       dst           += 4;
       src           += 4;
       src           += 4;
@@ -693,29 +657,32 @@ conv_rgbaF_rgbF (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgbF_rgbaF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
 
   while (n--)
     {
-      *(float *) dst = (*(float *) src);
+      *(uint32_t *) dst = (*(uint32_t *) src);
       src           += 4;
       dst           += 4;
-      *(float *) dst = (*(float *) src);
+      *(uint32_t *) dst = (*(uint32_t *) src);
       src           += 4;
       dst           += 4;
-      *(float *) dst = (*(float *) src);
+      *(uint32_t *) dst = (*(uint32_t *) src);
       src           += 4;
       dst           += 4;
-      *(float *) dst = 1.0;
+      *(uint32_t *) dst = 1.0;
       dst           += 4;
     }
   return samples;
 }
 
-static INLINE long
+#define conv_rgbF_rgbAF    conv_rgbF_rgbaF
+
+
+static long
 conv_gaF_gF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -730,7 +697,7 @@ conv_gaF_gF (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_gF_gaF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -752,7 +719,7 @@ conv_gF_gaF (unsigned char *src, unsigned char *dst, long samples)
 
 /* colorchannel dropping and adding */
 
-static INLINE long
+static long
 conv_gF_rgbF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -771,7 +738,7 @@ conv_gF_rgbF (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_gaF_rgbaF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -798,7 +765,7 @@ conv_gaF_rgbaF (unsigned char *src, unsigned char *dst, long samples)
 /* other conversions coded for some optimisation reason or sumthin */
 
 
-static INLINE long
+static long
 conv_rgbaF_rgbA8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -810,68 +777,18 @@ conv_rgbaF_rgbA8 (unsigned char *src, unsigned char *dst, long samples)
 
       for (c = 0; c < 3; c++)
         {
-          *(unsigned char *) dst = ((*(float *) src) * alpha) * 255.0;
+          *(unsigned char *) dst = lrint (((*(float *) src) * alpha) * 255.0);
           dst                   += 1;
           src                   += 4;
         }
-      *(unsigned char *) dst = alpha * 255.0;
+      *(unsigned char *) dst = lrint (alpha * 255.0);
       dst++;
       src += 4;
     }
   return samples;
 }
 
-static INLINE long
-conv_rgbaF_rgbA16 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      float alpha = (*(float *) src + (4 * 3));
-      int   c;
-
-      for (c = 0; c < 3; c++)
-        {
-          *(unsigned short *) dst = ((*(float *) src) * alpha) * 65535.0;
-          dst                    += 2;
-          src                    += 4;
-        }
-      *(unsigned short *) dst = alpha * 65535.0;
-      dst                    += 2;
-      src                    += 4;
-    }
-  return samples;
-}
-#if 0
-static INLINE long
-conv_rgbaF_rgb8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      int c;
-
-      for (c = 0; c < 3; c++)
-        {
-          int val = rint ((*(float *) src) * 255.0);
-          if (val < 0)
-            *(unsigned char *) dst = 0;
-          else if (val > 255)
-            *(unsigned char *) dst = 255;
-          else
-            *(unsigned char *) dst = val;
-          dst += 1;
-          src += 4;
-        }
-      src += 4;
-    }
-  return samples;
-}
-#endif
-
-static INLINE long
+static long
 conv_rgbaF_rgb16 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -882,7 +799,7 @@ conv_rgbaF_rgb16 (unsigned char *src, unsigned char *dst, long samples)
 
       for (c = 0; c < 3; c++)
         {
-          *(unsigned short *) dst = (*(float *) src) * 65535.0;
+          *(unsigned short *) dst = lrint ((*(float *) src) * 65535.0);
           dst                    += 2;
           src                    += 4;
         }
@@ -891,29 +808,7 @@ conv_rgbaF_rgb16 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
-conv_rgbP8_rgbaF (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      int c;
-
-      for (c = 0; c < 3; c++)
-        {
-          (*(float *) dst) = *(unsigned char *) src / 255.0;
-          dst             += 4;
-          src             += 1;
-        }
-      (*(float *) dst) = 1.0;
-      dst             += 4;
-      src             += 1;
-    }
-  return samples;
-}
-
-static INLINE long
+static long
 conv_rgbA16_rgbaF (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -937,7 +832,7 @@ conv_rgbA16_rgbaF (unsigned char *src, unsigned char *dst, long samples)
 }
 
 /*
-   static INLINE long
+   static long
    conv_rgb8_rgbaF (unsigned char *src,
                  unsigned char *dst,
                  int samples)
@@ -957,7 +852,7 @@ conv_rgbA16_rgbaF (unsigned char *src, unsigned char *dst, long samples)
    return samples;
    }
 
-   static INLINE long
+   static long
    conv_g8_rgbaF (unsigned char *src,
                unsigned char *dst,
                int samples)
@@ -977,7 +872,7 @@ conv_rgbA16_rgbaF (unsigned char *src, unsigned char *dst, long samples)
    return samples;
    }
 
-   static INLINE long
+   static long
    conv_rgb16_rgbaF (unsigned char *src,
                   unsigned char *dst,
                   int samples)
@@ -998,7 +893,7 @@ conv_rgbA16_rgbaF (unsigned char *src, unsigned char *dst, long samples)
    return samples;
    }
 
-   static INLINE long
+   static long
    conv_gF_rgbaF (unsigned char *src,
                unsigned char *dst,
                int samples)
@@ -1019,7 +914,7 @@ conv_rgbA16_rgbaF (unsigned char *src, unsigned char *dst, long samples)
    return samples;
    }
  */
-static INLINE long
+static long
 conv_rgba8_rgbA8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -1036,9 +931,10 @@ conv_rgba8_rgbA8 (unsigned char *src, unsigned char *dst, long samples)
         }
       else
         {
-          dst[0] = (src[0] * src[3]) >> 8;      /* FIXME: check if this faster */
-          dst[1] = (src[1] * src[3]) >> 8;      /*        version (>>8 vs /255) */
-          dst[2] = (src[2] * src[3]) >> 8;      /*        is accurate enough   */
+#define div_255(a) ((((a)+127)+(((a)+127)>>8))>>8)
+          dst[0] = div_255 (src[0] * src[3]);
+          dst[1] = div_255 (src[1] * src[3]);
+          dst[2] = div_255 (src[2] * src[3]);
           dst[3] = src[3];
         }
       dst += 4;
@@ -1047,7 +943,7 @@ conv_rgba8_rgbA8 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgbA8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -1066,10 +962,10 @@ conv_rgbA8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
         }
       else
         {
-          unsigned int aa = (255 << 16) / src[3];
-          *dst++ = (src[0] * aa) >> 16;
-          *dst++ = (src[1] * aa) >> 16;
-          *dst++ = (src[2] * aa) >> 16;
+          unsigned int aa = ((255 << 16) + (src[3] >> 1)) / src[3];
+          *dst++ = (src[0] * aa + 0x8000) >> 16;
+          *dst++ = (src[1] * aa + 0x8000) >> 16;
+          *dst++ = (src[2] * aa + 0x8000) >> 16;
           *dst++ = src[3];
         }
       src += 4;
@@ -1077,225 +973,26 @@ conv_rgbA8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
-conv_argb8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[2];
-      dst[1] = src[1];
-      dst[2] = src[0];
-      dst[3] = src[3];
-      src   += 4;
-      dst   += 4;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_rgba8_argb8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[3];
-      dst[1] = src[0];
-      dst[2] = src[1];
-      dst[3] = src[2];
-      src   += 4;
-      dst   += 4;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_Argb8_rgbA8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[2];
-      dst[1] = src[1];
-      dst[2] = src[0];
-      dst[3] = src[3];
-      src   += 4;
-      dst   += 4;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_rgbA8_Argb8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[2];
-      dst[1] = src[1];
-      dst[2] = src[0];
-      dst[3] = src[3];
-      src   += 4;
-      dst   += 4;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_Prgb8_rgbP8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[2];
-      dst[1] = src[1];
-      dst[2] = src[0];
-      dst[3] = 255;
-      src   += 4;
-      dst   += 4;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_rgbP8_Prgb8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[2];
-      dst[1] = src[1];
-      dst[2] = src[0];
-      dst[3] = 255;
-      src   += 4;
-      dst   += 4;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_Prgb8_rgb8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[2];
-      dst[1] = src[1];
-      dst[2] = src[0];
-      /*dst[3] = src[3]; */
-      src += 4;
-      dst += 3;
-    }
-  return samples;
-}
-
-
-/* FIXME: this is actually BGRP */
-static INLINE long
-conv_rgb8_Prgb8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[2];          /* blue */
-      dst[1] = src[1];          /* green */
-      dst[2] = src[0];          /* red */
-      dst[3] = 255;
-      src   += 3;
-      dst   += 4;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_rgb8_rgbP8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[0];
-      dst[1] = src[1];
-      dst[2] = src[2];
-      src   += 3;
-      dst   += 4;
-    }
-  return samples;
-}
-
-static INLINE long
+static long
 conv_rgb8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
 {
-  long n = samples;
-
+  long n = samples-1;
   while (n--)
     {
-      /**(unsigned int *) dst = *(unsigned int *) src;
-         dst[3] = 255;*/
-
-      dst[0] = src[0];
-      dst[1] = src[1];
-      dst[2] = src[2];
-      dst[3] = 255;
+      *(unsigned int *) dst = (*(unsigned int *) src) | (255 << 24);
       src   += 3;
       dst   += 4;
     }
+  dst[0] = src[0];
+  dst[1] = src[1];
+  dst[2] = src[2];
+  dst[3] = 255;
   return samples;
 }
 
 #define conv_rgb8_rgbA8    conv_rgb8_rgba8
 
-static INLINE long
-conv_rgbP8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      *(unsigned int *) dst = *(unsigned int *) src;
-      dst[3]                = 255;
-      src                  += 4;
-      dst                  += 4;
-    }
-  return samples;
-}
-
-#define conv_rgbP8_rgbA8    conv_rgbP8_rgba8
-
-static INLINE long
-conv_rgba8_rgbP8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  memcpy (dst, src, samples * 4);
-  return samples;
-}
-
-#define conv_rgbA8_rgbP8    conv_rgba8_rgbP8
-
-static INLINE long
-conv_rgbP8_rgb8 (unsigned char *src, unsigned char *dst, long samples)
-{
-  long n = samples;
-
-  while (n--)
-    {
-      dst[0] = src[0];
-      dst[1] = src[1];
-      dst[2] = src[2];
-      src   += 4;
-      dst   += 3;
-    }
-  return samples;
-}
-
-static INLINE long
+static long
 conv_rgba8_rgb8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -1311,7 +1008,7 @@ conv_rgba8_rgb8 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-static INLINE long
+static long
 conv_rgbA8_rgb8 (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
@@ -1333,10 +1030,10 @@ conv_rgbA8_rgb8 (unsigned char *src, unsigned char *dst, long samples)
         }
       else
         {
-          unsigned int aa = (255 << 16) / alpha;
-          *dst++ = (src[0] * aa) >> 16;
-          *dst++ = (src[1] * aa) >> 16;
-          *dst++ = (src[2] * aa) >> 16;
+          unsigned int aa = ((255 << 16) + (alpha >> 1)) / alpha;
+          *dst++ = (src[0] * aa + 0x8000) >> 16;
+          *dst++ = (src[1] * aa + 0x8000) >> 16;
+          *dst++ = (src[2] * aa + 0x8000) >> 16;
         }
       src += 4;
     }
@@ -1367,7 +1064,7 @@ conv_rgbA8_rgb8 (unsigned char *src, unsigned char *dst, long samples)
 
 
 
-  static INLINE long
+  static long
 conv_yuvaF_rgbaF (unsigned char *src, unsigned char *dst, long samples)
 {
   float *src_f = (float *) src;
@@ -1399,7 +1096,7 @@ conv_yuvaF_rgbaF (unsigned char *src, unsigned char *dst, long samples)
 }
 
 
-static INLINE long
+static long
 conv_yuvF_rgbF (unsigned char *src, unsigned char *dst, long samples)
 {
   float *src_f = (float *) src;
@@ -1429,203 +1126,6 @@ conv_yuvF_rgbF (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
-
-/******* lab, xyz and rgb interaction, lifted from cpercep by adam d. moss */
-
-/*
-   static const double Xn = 0.951;
-   static const double Yn = 1.0;
-   static const double Zn = 1.089;
- */
-
-#define LXN    0.312713F
-#define LYN    0.329016F
-
-static const double lxn = LXN;
-static const double lyn = LYN;
-static double       xnn = LXN / LYN;
-static double       znn = (1.0F - (LXN + LYN)) / LYN;
-
-
-static const double LRAMP = 7.99959199F;
-
-static INLINE long
-conv_rgbF_xyzF (unsigned char *src, unsigned char *dst, long samples)
-{
-  float *src_f = (float *) src;
-  float *dst_f = (float *) dst;
-  long   n     = samples;
-
-  while (n--)
-    {
-      float x, y, z;
-      float red, green, blue;
-
-      red   = src_f[0];
-      green = src_f[1];
-      blue  = src_f[2];
-
-      x = 0.431 * red + 0.342 * green + 0.179 * blue;
-      y = 0.222 * red + 0.707 * green + 0.071 * blue;
-      z = 0.020 * red + 0.130 * green + 0.939 * blue;
-
-      dst_f[0] = x;
-      dst_f[1] = y;
-      dst_f[2] = z;
-      dst_f   += 3;
-      src_f   += 3;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_xyzF_rgbF (unsigned char *src, unsigned char *dst, long samples)
-{
-  float *src_f = (float *) src;
-  float *dst_f = (float *) dst;
-  long   n     = samples;
-
-  while (n--)
-    {
-      dst_f[0] = src_f[0];
-      dst_f[1] = src_f[1];
-      dst_f[2] = src_f[2];
-      dst_f   += 3;
-      src_f   += 3;
-    }
-  return samples;
-}
-
-static INLINE double
-ffunc (const double t)
-{
-  if (t > 0.008856F)
-    {
-      return (cbrt (t));
-    }
-  else
-    {
-      return (7.787F * t + 16.0F / 116.0F);
-    }
-}
-
-
-static INLINE double
-ffunc_inv (const double t)
-{
-  if (t > 0.206893F)
-    {
-      return (t * t * t);
-    }
-  else
-    {
-      return ((t - 16.0F / 116.0F) / 7.787F);
-    }
-}
-
-static INLINE long
-conv_labF_xyzF (unsigned char *src, unsigned char *dst, long samples)
-{
-  float *src_f = (float *) src;
-  float *dst_f = (float *) dst;
-  long   n     = samples;
-
-  while (n--)
-    {
-      float P;
-      float X, Y, Z;
-      float L, a, b;
-
-      L = src_f[0];
-      a = src_f[1];
-      b = src_f[2];
-
-      if (L > LRAMP)
-        {
-          P = Y = (L + 16.0F) / 116.0F;
-          Y = Y * Y * Y;
-        }
-      else
-        {
-          Y = L / 903.3F;
-          P = 7.787F * Y + 16.0F / 116.0F;
-        }
-
-      X = (P + a / 500.0F);
-      X = xnn *ffunc_inv (X);
-      Z = (P - b / 200.0F);
-      Z = znn *ffunc_inv (Z);
-
-
-      dst_f[0] = X;
-      dst_f[1] = Y;
-      dst_f[2] = Z;
-      dst_f   += 3;
-      src_f   += 3;
-    }
-  return samples;
-}
-
-static INLINE long
-conv_xyzF_labF (unsigned char *src, unsigned char *dst, long samples)
-{
-  float *src_f = (float *) src;
-  float *dst_f = (float *) dst;
-  long   n     = samples;
-
-  while (n--)
-    {
-      double ffuncY;
-      float  X, Y, Z;
-      float  L, a, b;
-      X = src_f[0];
-      Y = src_f[1];
-      Z = src_f[2];
-
-      if (Y > 0.0F)
-        {
-          if (Y > 0.008856F)
-            {
-              L = (116.0F * cbrt (Y)) - 16.0F;
-            }
-          else
-            {
-              L = (Y * 903.3F);
-            }
-        }
-      else
-        {
-          L = 0.0;
-        }
-
-      ffuncY = ffunc (Y);
-      a      = 500.0F * (ffunc (X / xnn) - ffuncY);
-      b      = 200.0F * (ffuncY - ffunc (Z / znn));
-
-      dst_f[0] = L;
-      dst_f[1] = a;
-      dst_f[2] = b;
-      dst_f   += 3;
-      src_f   += 3;
-    }
-  return samples;
-}
-
-/******* end of cpercep lift out **/
-
-
-#define MAX_CONVERSIONS    100
-
-typedef struct Conversion
-{
-  int from_fmt;
-  int to_fmt;
-  int cost;               /* cost of function,. calculated as ms to convert 1024*1024 samples */
-  int loss;                     /* 0 maps ok, 1 precision loss, 2 alpha loss, 4 channel loss
-                                   (should be dwelled further into) */
-  void (*function)(unsigned char *src, unsigned char *dst, long samples);
-} Conversion;
-
 int init (void);
 
 int
@@ -1812,29 +1312,11 @@ init (void)
   o (g16, gF);
   o (ga16, ga8);
   o (g16, g8);
-  o (rgbaF, rgbAF);
-  o (rgbAF, rgbaF);
   o (yuvF, rgbF);
   o (yuvaF, rgbaF);
-  o (rgbA8, rgbA16);
-  o (rgb8, rgb16);
   o (ga8, ga16);
   o (gA8, gA16);
   o (g8, g16);
-  o (rgba8, rgbaF);
-  o (rgbA8, rgbAF);
-  o (rgb8, rgbF);
-  o (ga8, gaF);
-  o (gA8, gAF);
-  o (g8, gF);
-  o (rgba16, rgbaF);
-  o (rgbA16, rgbAF);
-  o (rgb16, rgbF);
-  o (ga16, gaF);
-  o (gA16, gAF);
-  o (g16, gF);
-  o (rgbaF, rgbAF);
-  o (rgbAF, rgbaF);
   o (gaF, gAF);
   o (gAF, gaF);
   o (rgbaF, rgbF);
@@ -1847,12 +1329,8 @@ init (void)
   o (gaF, rgbaF);
   o (gAF, rgbAF);
   o (rgbaF, rgb8);
-  o (rgbA8, rgbAF);
-  o (ga8, gaF);
-  o (gA8, gAF);
   o (rgbA8, rgba8);
   o (rgba8, rgbA8);
-  o (gAF, rgbAF);
   o (rgbaF, rgb16);
   o (rgb8, rgba8);
   o (rgb8, rgbA8);
@@ -1860,16 +1338,13 @@ init (void)
   o (rgba8, rgb8);
   o (rgbaF, rgbA8);
   o (rgbA16, rgbaF);
-  o (yuvF, rgbF);
-  o (yuvaF, rgbaF);
   o (rgbaF, rgbaD);
   o (rgbaD, rgbaF);
-  o (rgbaF, rgb8);
-#if 0
-  o (rgbF, xyzF);
-  o (xyzF, rgbF);
-  o (labF, xyzF);
-  o (xyzF, labF);
+  o (rgb8, rgbaF);
+
+#ifdef USE_TABLES
+  if (!table_inited)
+    table_init ();
 #endif
 
   return 0;
diff --git a/extensions/grey.c b/extensions/grey.c
new file mode 100644 (file)
index 0000000..a6fef28
--- /dev/null
@@ -0,0 +1,137 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2013, Daniel Sabo
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+#include <stdio.h>
+
+#include "babl.h"
+
+#include "base/util.h"
+#include "base/rgb-constants.h"
+#include "extensions/util.h"
+
+/* There was some debate on #gimp about whether these constants
+ * are accurate, for now I've elected to just follow whatever
+ * babl/base does.
+ *   - Daniel
+ */
+
+/* Float versions of the double constants in rgb-constants.h */
+static const float RGB_LUMINANCE_RED_FLOAT = RGB_LUMINANCE_RED;
+static const float RGB_LUMINANCE_GREEN_FLOAT = RGB_LUMINANCE_GREEN;
+static const float RGB_LUMINANCE_BLUE_FLOAT = RGB_LUMINANCE_BLUE;
+
+static long
+conv_rgbaF_linear_y8_linear (unsigned char *src,
+                             unsigned char *dst,
+                             long           samples)
+{
+  static const float RGB_LUMINANCE_RED_FLOAT = RGB_LUMINANCE_RED;
+  static const float RGB_LUMINANCE_GREEN_FLOAT = RGB_LUMINANCE_GREEN;
+  static const float RGB_LUMINANCE_BLUE_FLOAT = RGB_LUMINANCE_BLUE;
+
+  float *s = (float *) src;
+  long   n = samples;
+
+  while (n--)
+    {
+      float value;
+      long int v;
+      value  = *s++ * RGB_LUMINANCE_RED_FLOAT;
+      value += *s++ * RGB_LUMINANCE_GREEN_FLOAT;
+      value += *s++ * RGB_LUMINANCE_BLUE_FLOAT;
+      s++;
+
+      v = rint (value * 255.0);
+      *dst++ = (v < 0) ? 0 : ((v > 255) ? 255 : v);
+    }
+
+  return samples;
+}
+
+static long
+conv_rgbaF_linear_yF_linear (unsigned char *src,
+                             unsigned char *dst,
+                             long           samples)
+{
+
+  float *s = (float *) src;
+  float *d = (float *) dst;
+  long   n = samples;
+
+  while (n--)
+    {
+      float value;
+      value  = *s++ * RGB_LUMINANCE_RED_FLOAT;
+      value += *s++ * RGB_LUMINANCE_GREEN_FLOAT;
+      value += *s++ * RGB_LUMINANCE_BLUE_FLOAT;
+      s++;
+      *d++ = value;
+    }
+
+  return samples;
+}
+
+static long
+conv_rgbaF_linear_yaF_linear (unsigned char *src,
+                              unsigned char *dst,
+                              long           samples)
+{
+
+  float *s = (float *) src;
+  float *d = (float *) dst;
+  long   n = samples;
+
+  while (n--)
+    {
+      float value;
+      value  = *s++ * RGB_LUMINANCE_RED_FLOAT;
+      value += *s++ * RGB_LUMINANCE_GREEN_FLOAT;
+      value += *s++ * RGB_LUMINANCE_BLUE_FLOAT;
+      *d++ = value;
+      *d++ = *s++;  /* alpha */
+    }
+
+  return samples;
+}
+
+int init (void);
+
+int
+init (void)
+{
+  babl_conversion_new (babl_format ("RGBA float"),
+                       babl_format ("Y u8"),
+                       "linear",
+                       conv_rgbaF_linear_y8_linear,
+                       NULL);
+
+  babl_conversion_new (babl_format ("RGBA float"),
+                       babl_format ("Y float"),
+                       "linear",
+                       conv_rgbaF_linear_yF_linear,
+                       NULL);
+
+  babl_conversion_new (babl_format ("RGBA float"),
+                       babl_format ("YA float"),
+                       "linear",
+                       conv_rgbaF_linear_yaF_linear,
+                       NULL);
+
+  return 0;
+}
index 75723da87be3a4886b3ca8c4cac4a7d82a6f0dc5..f92b0d21f8f2caede7968d062e09f2c33643a187 100644 (file)
@@ -21,6 +21,7 @@
 #include <string.h>
 
 #include "babl.h"
+#include "base/util.h"
 
 
 static long  rgba_to_cmyk (char *src,
@@ -31,6 +32,14 @@ static long  cmyk_to_rgba (char *src,
                            char *dst,
                            long  n);
 
+static long  rgba_to_cmy  (char *src,
+                           char *dst,
+                           long  n);
+
+static long  cmy_to_rgba  (char *src,
+                           char *dst,
+                           long  n);
+
 int init (void);
 
 int
@@ -49,6 +58,13 @@ init (void)
     babl_component ("key"),
     NULL
   );
+  babl_model_new (
+    "name", "CMY",
+    babl_component ("cyan"),
+    babl_component ("magenta"),
+    babl_component ("yellow"),
+    NULL
+  );
 
   babl_conversion_new (
     babl_model ("RGBA"),
@@ -56,20 +72,52 @@ init (void)
     "linear", rgba_to_cmyk,
     NULL
   );
-
   babl_conversion_new (
     babl_model ("CMYK"),
     babl_model ("RGBA"),
     "linear", cmyk_to_rgba,
     NULL
   );
+  babl_conversion_new (
+    babl_model ("RGBA"),
+    babl_model ("CMY"),
+    "linear", rgba_to_cmy,
+    NULL
+  );
+  babl_conversion_new (
+    babl_model ("CMY"),
+    babl_model ("RGBA"),
+    "linear", cmy_to_rgba,
+    NULL
+  );
+
   babl_format_new (
     "name", "CMYK float",
     babl_model ("CMYK"),
     babl_type ("float"),
     babl_component ("cyan"),
+    babl_component ("magenta"),
+    babl_component ("yellow"),
+    babl_component ("key"),
+    NULL
+  );
+  babl_format_new (
+    "name", "CMY float",
+    babl_model ("CMY"),
+    babl_type ("float"),
+    babl_component ("cyan"),
+    babl_component ("magenta"),
     babl_component ("yellow"),
+    NULL
+  );
+
+  babl_format_new (
+    "name", "CMYK u8",
+    babl_model ("CMYK"),
+    babl_type ("u8"),
+    babl_component ("cyan"),
     babl_component ("magenta"),
+    babl_component ("yellow"),
     babl_component ("key"),
     NULL
   );
@@ -85,9 +133,9 @@ rgba_to_cmyk (char *src,
 {
   while (n--)
     {
-      double red   = ((double *) src)[0];
-      double green = ((double *) src)[1];
-      double blue  = ((double *) src)[2];
+      double red   = linear_to_gamma_2_2 (((double *) src)[0]);
+      double green = linear_to_gamma_2_2 (((double *) src)[1]);
+      double blue  = linear_to_gamma_2_2 (((double *) src)[2]);
 
       double cyan, magenta, yellow, key;
 
@@ -157,9 +205,9 @@ cmyk_to_rgba (char *src,
       green = 1.0 - magenta;
       blue  = 1.0 - yellow;
 
-      ((double *) dst)[0] = red;
-      ((double *) dst)[1] = green;
-      ((double *) dst)[2] = blue;
+      ((double *) dst)[0] = gamma_2_2_to_linear (red);
+      ((double *) dst)[1] = gamma_2_2_to_linear (green);
+      ((double *) dst)[2] = gamma_2_2_to_linear (blue);
 
       ((double *) dst)[3] = 1.0;
 
@@ -169,3 +217,58 @@ cmyk_to_rgba (char *src,
   return n;
 }
 
+static long
+rgba_to_cmy (char *src,
+             char *dst,
+             long  n)
+{
+  while (n--)
+    {
+      double red   = linear_to_gamma_2_2 (((double *) src)[0]);
+      double green = linear_to_gamma_2_2 (((double *) src)[1]);
+      double blue  = linear_to_gamma_2_2 (((double *) src)[2]);
+
+      double cyan, magenta, yellow;
+
+      cyan    = 1.0 - red;
+      magenta = 1.0 - green;
+      yellow  = 1.0 - blue;
+
+      ((double *) dst)[0] = cyan;
+      ((double *) dst)[1] = magenta;
+      ((double *) dst)[2] = yellow;
+
+      src += 4 * sizeof (double);
+      dst += 3 * sizeof (double);
+    }
+  return n;
+}
+
+static long
+cmy_to_rgba (char *src,
+              char *dst,
+              long  n)
+{
+  while (n--)
+    {
+      double cyan    = ((double *) src)[0];
+      double magenta = ((double *) src)[1];
+      double yellow  = ((double *) src)[2];
+
+      double red, green, blue;
+
+      red   = 1.0 - cyan;
+      green = 1.0 - magenta;
+      blue  = 1.0 - yellow;
+
+      ((double *) dst)[0] = gamma_2_2_to_linear (red);
+      ((double *) dst)[1] = gamma_2_2_to_linear (green);
+      ((double *) dst)[2] = gamma_2_2_to_linear (blue);
+
+      ((double *) dst)[3] = 1.0;
+
+      src += 3 * sizeof (double);
+      dst += 4 * sizeof (double);
+    }
+  return n;
+}
diff --git a/extensions/simple.c b/extensions/simple.c
new file mode 100644 (file)
index 0000000..bde7785
--- /dev/null
@@ -0,0 +1,164 @@
+#include <stdlib.h>
+#include <stdint.h>
+#include "babl.h"
+
+int init (void);
+
+static inline long
+float_to_u8 (unsigned char *src_char, unsigned char *dst, long samples)
+{
+  float *src = (float *)src_char;
+  long n = samples;
+  while (n--)
+    {
+      float r = src[0];
+      float g = src[1];
+      float b = src[2];
+      float a = src[3];
+            
+      dst[0] = (r >= 1.0f) ? 0xFF : ((r <= 0.0f) ? 0x0 : 0xFF * r + 0.5f);
+      dst[1] = (g >= 1.0f) ? 0xFF : ((g <= 0.0f) ? 0x0 : 0xFF * g + 0.5f);
+      dst[2] = (b >= 1.0f) ? 0xFF : ((b <= 0.0f) ? 0x0 : 0xFF * b + 0.5f);
+      dst[3] = (a >= 1.0f) ? 0xFF : ((a <= 0.0f) ? 0x0 : 0xFF * a + 0.5f);
+      
+      dst += 4;
+      src += 4;
+    }
+  return samples;
+}
+
+static inline long
+float_pre_to_u8_pre (unsigned char *src_char, unsigned char *dst, long samples)
+{
+  float *src = (float *)src_char;
+  long n = samples;
+  while (n--)
+    {
+      float r = src[0];
+      float g = src[1];
+      float b = src[2];
+      float a = src[3];
+      
+      if (a > 1.0f) {
+        r /= a;
+        g /= a;
+        b /= a;
+        a /= a;
+      }
+      
+      dst[0] = (r >= 1.0f) ? 0xFF : ((r <= 0.0f) ? 0x0 : 0xFF * r + 0.5f);
+      dst[1] = (g >= 1.0f) ? 0xFF : ((g <= 0.0f) ? 0x0 : 0xFF * g + 0.5f);
+      dst[2] = (b >= 1.0f) ? 0xFF : ((b <= 0.0f) ? 0x0 : 0xFF * b + 0.5f);
+      dst[3] = (a >= 1.0f) ? 0xFF : ((a <= 0.0f) ? 0x0 : 0xFF * a + 0.5f);
+      
+      dst += 4;
+      src += 4;
+
+    }
+  return samples;
+}
+
+static inline long
+float_to_u16 (unsigned char *src_char, unsigned char *dst_char, long samples)
+{
+  float *src    = (float *)src_char;
+  uint16_t *dst = (uint16_t *)dst_char;
+  long n = samples;
+  while (n--)
+    {
+      float r = src[0];
+      float g = src[1];
+      float b = src[2];
+      float a = src[3];
+            
+      dst[0] = (r >= 1.0f) ? 0xFFFF : ((r <= 0.0f) ? 0x0 : 0xFFFF * r + 0.5f);
+      dst[1] = (g >= 1.0f) ? 0xFFFF : ((g <= 0.0f) ? 0x0 : 0xFFFF * g + 0.5f);
+      dst[2] = (b >= 1.0f) ? 0xFFFF : ((b <= 0.0f) ? 0x0 : 0xFFFF * b + 0.5f);
+      dst[3] = (a >= 1.0f) ? 0xFFFF : ((a <= 0.0f) ? 0x0 : 0xFFFF * a + 0.5f);
+      
+      dst += 4;
+      src += 4;
+    }
+  return samples;
+}
+
+static inline long
+float_pre_to_u16_pre (unsigned char *src_char, unsigned char *dst_char, long samples)
+{
+  float *src = (float *)src_char;
+  uint16_t *dst = (uint16_t *)dst_char;
+  long n = samples;
+  while (n--)
+    {
+      float r = src[0];
+      float g = src[1];
+      float b = src[2];
+      float a = src[3];
+      
+      if (a > 1.0f) {
+        r /= a;
+        g /= a;
+        b /= a;
+        a /= a;
+      }
+      
+      dst[0] = (r >= 1.0f) ? 0xFFFF : ((r <= 0.0f) ? 0x0 : 0xFFFF * r + 0.5f);
+      dst[1] = (g >= 1.0f) ? 0xFFFF : ((g <= 0.0f) ? 0x0 : 0xFFFF * g + 0.5f);
+      dst[2] = (b >= 1.0f) ? 0xFFFF : ((b <= 0.0f) ? 0x0 : 0xFFFF * b + 0.5f);
+      dst[3] = (a >= 1.0f) ? 0xFFFF : ((a <= 0.0f) ? 0x0 : 0xFFFF * a + 0.5f);
+      
+      dst += 4;
+      src += 4;
+    }
+  return samples;
+}
+
+int
+init (void)
+{
+  /* float and u8 */
+  babl_conversion_new (babl_format ("R'G'B'A float"),
+                       babl_format ("R'G'B'A u8"),
+                      "linear", 
+                       float_to_u8,
+                       NULL);
+  babl_conversion_new (babl_format ("RGBA float"),
+                       babl_format ("RGBA u8"),
+                      "linear", 
+                       float_to_u8,
+                       NULL);
+  babl_conversion_new (babl_format ("R'aG'aB'aA float"),
+                       babl_format ("R'aG'aB'aA u8"),
+                      "linear", 
+                       float_pre_to_u8_pre,
+                       NULL);
+  babl_conversion_new (babl_format ("RaGaBaA float"),
+                       babl_format ("RaGaBaA u8"),
+                      "linear", 
+                       float_pre_to_u8_pre,
+                       NULL);
+
+  /* float and u16 */
+  babl_conversion_new (babl_format ("R'G'B'A float"),
+                       babl_format ("R'G'B'A u16"),
+                      "linear", 
+                       float_to_u16,
+                       NULL);
+  babl_conversion_new (babl_format ("RGBA float"),
+                       babl_format ("RGBA u16"),
+                      "linear", 
+                       float_to_u16,
+                       NULL);
+  babl_conversion_new (babl_format ("R'aG'aB'aA float"),
+                       babl_format ("R'aG'aB'aA u16"),
+                      "linear", 
+                       float_pre_to_u16_pre,
+                       NULL);
+  babl_conversion_new (babl_format ("RaGaBaA float"),
+                       babl_format ("RaGaBaA u16"),
+                      "linear", 
+                       float_pre_to_u16_pre,
+                       NULL);
+
+  return 0;
+}
diff --git a/extensions/sse-fixups.c b/extensions/sse-fixups.c
deleted file mode 100644 (file)
index b44bb5e..0000000
+++ /dev/null
@@ -1,243 +0,0 @@
-/* babl - dynamically extendable universal pixel conversion library.
- * Copyright (C) 2005-2008, Øyvind Kolås and others.
- *
- * SSE optimized conversion routines.
- * Copyright (C) 2008, Jan Heller.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, see
- * <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#if defined(__GNUC__) && (__GNUC__ >= 4) && defined(USE_SSE) && defined(USE_MMX)
-
-#include <stdint.h>
-#include <stdlib.h>
-
-#include "babl.h"
-#include "babl-cpuaccel.h"
-#include "extensions/util.h"
-
-#define INLINE inline
-
-typedef float g4float __attribute__ ((vector_size (4*sizeof(float))));
-typedef int   g2int   __attribute__ ((vector_size (2*sizeof(int))));
-
-#define g4float(a,b,c,d)  ((g4float){a,b,c,d})
-#define g4float_all(val)  g4float(val,val,val,val)
-#define g4float_zero      g4float_all(0.0)
-#define g4float_ff        g4float_all(255.0)
-
-#define g4float_max(a,b)    __builtin_ia32_maxps(a, b)
-#define g4float_min(a,b)    __builtin_ia32_minps(a, b)
-#define g4float_cvt2pi(a)   __builtin_ia32_cvtps2pi(a)
-#define g4float_movhl(a,b)  __builtin_ia32_movhlps(a, b)
-#define g4float_emms        __builtin_ia32_emms
-
-
-static INLINE long
-conv_rgbaF_linear_rgb8_linear (unsigned char *src, 
-                               unsigned char *dst, 
-                               long           samples)
-{
-  long n = samples;
-
-  if ((intptr_t) src & 0xF)
-    {
-      // nonaligned buffers, we have to use fallback x87 code
-      float *fsrc = (float *) src;
-      int v;
-
-      while (n--)
-        {
-          v = rint (*fsrc++ * 255.0);
-          *dst++ = (v < 0) ? 0 : ((v > 255) ? 255 : v);
-
-          v = rint (*fsrc++ * 255.0);
-          *dst++ = (v < 0) ? 0 : ((v > 255) ? 255 : v);
-         
-          v = rint (*fsrc++ * 255.0);
-          *dst++ = (v < 0) ? 0 : ((v > 255) ? 255 : v);
-
-          fsrc++;
-        }
-    }
-  else   
-    {
-      // all is well, buffers are SSE compatible
-      g4float *g4src = (g4float *) src;
-      g4float v;
-
-      union {
-       g2int si; 
-       unsigned char c[8];
-      } u;
-
-      while (n--)
-        {
-           v = *g4src++ * g4float_ff;
-           v = g4float_min(v, g4float_ff);
-           v = g4float_max(v, g4float_zero);
-           u.si = g4float_cvt2pi (v);
-           *dst++  = u.c[0];
-           *dst++  = u.c[4];
-           v = g4float_movhl (v, v);
-           u.si = g4float_cvt2pi (v);  
-           *dst++  = u.c[0];
-        }
-
-      g4float_emms ();
-    }
-
-  return samples;
-}
-
-
-static INLINE long
-conv_rgbaF_linear_rgba8_linear (unsigned char *src, 
-                                unsigned char *dst, 
-                                long           samples)
-{
-  long n = samples;
-  if ((intptr_t) src & 0xF)
-    {
-      // nonaligned buffers, we have to use fallback x87 code
-      float *fsrc = (float *) src;
-      int v;
-
-      while (n--)
-        {
-          v = rint (*fsrc++ * 255.0);
-          *dst++ = (v < 0) ? 0 : ((v > 255) ? 255 : v);
-
-          v = rint (*fsrc++ * 255.0);
-          *dst++ = (v < 0) ? 0 : ((v > 255) ? 255 : v);
-         
-          v = rint (*fsrc++ * 255.0);
-          *dst++ = (v < 0) ? 0 : ((v > 255) ? 255 : v);
-
-          v = rint (*fsrc++ * 255.0);
-          *dst++ = (v < 0) ? 0 : ((v > 255) ? 255 : v);
-        }
-    }
-  else   
-    {
-      // all is well, buffers are SSE compatible
-      g4float *g4src = (g4float *) src;
-      g4float v;
-
-      union {
-       g2int si; 
-       unsigned char c[8];
-      } u;
-
-      while (n--)
-        {
-           v = *g4src++ * g4float_ff;
-           v = g4float_min(v, g4float_ff);
-           v = g4float_max(v, g4float_zero);
-           u.si = g4float_cvt2pi (v);
-           *dst++  = u.c[0];
-           *dst++  = u.c[4];
-           v = g4float_movhl (v, v);
-           u.si = g4float_cvt2pi (v);  
-           *dst++  = u.c[0];
-           *dst++  = u.c[4];
-        }
-
-      g4float_emms ();
-    }
-
-  return samples;
-}
-
-#define conv_rgbaF_gamma_rgba8_gamma conv_rgbaF_linear_rgba8_linear
-#define conv_rgbaF_gamma_rgb8_gamma conv_rgbaF_linear_rgb8_linear
-
-
-#endif
-
-#define o(src, dst) \
-  babl_conversion_new (src, dst, "linear", conv_ ## src ## _ ## dst, NULL)
-
-int init (void);
-
-int
-init (void)
-{
-#if defined(__GNUC__) && (__GNUC__ >= 4) && defined(USE_SSE) && defined(USE_MMX)
-
-  const Babl *rgbaF_linear = babl_format_new (
-    babl_model ("RGBA"),
-    babl_type ("float"),
-    babl_component ("R"),
-    babl_component ("G"),
-    babl_component ("B"),
-    babl_component ("A"),
-    NULL);
-  const Babl *rgba8_linear = babl_format_new (
-    babl_model ("RGBA"),
-    babl_type ("u8"),
-    babl_component ("R"),
-    babl_component ("G"),
-    babl_component ("B"),
-    babl_component ("A"),
-    NULL);
-  const Babl *rgb8_linear = babl_format_new (
-    babl_model ("RGB"),
-    babl_type ("u8"),
-    babl_component ("R"),
-    babl_component ("G"),
-    babl_component ("B"),
-    NULL);
-
-  const Babl *rgbaF_gamma = babl_format_new (
-    babl_model ("R'G'B'A"),
-    babl_type ("float"),
-    babl_component ("R'"),
-    babl_component ("G'"),
-    babl_component ("B'"),
-    babl_component ("A"),
-    NULL);
-  const Babl *rgba8_gamma = babl_format_new (
-    babl_model ("R'G'B'A"),
-    babl_type ("u8"),
-    babl_component ("R'"),
-    babl_component ("G'"),
-    babl_component ("B'"),
-    babl_component ("A"),
-    NULL);
-  const Babl *rgb8_gamma = babl_format_new (
-    babl_model ("R'G'B'"),
-    babl_type ("u8"),
-    babl_component ("R'"),
-    babl_component ("G'"),
-    babl_component ("B'"),
-    NULL);
-
-  if ((babl_cpu_accel_get_support () & BABL_CPU_ACCEL_X86_MMX) &&
-      (babl_cpu_accel_get_support () & BABL_CPU_ACCEL_X86_SSE))
-    {
-      o (rgbaF_linear, rgb8_linear);
-      o (rgbaF_linear, rgba8_linear);
-      o (rgbaF_gamma, rgb8_gamma);
-      o (rgbaF_gamma, rgba8_gamma);
-    }
-
-#endif
-
-  return 0;
-}
-
diff --git a/extensions/sse2-float.c b/extensions/sse2-float.c
new file mode 100644 (file)
index 0000000..97b201b
--- /dev/null
@@ -0,0 +1,658 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2013 Massimo Valentini
+ * Copyright (C) 2013 Daniel Sabo
+ * Copyright (C) 2013 Loren Merritt
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#if defined(USE_SSE2)
+
+/* SSE 2 */
+#include <emmintrin.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+
+#include "babl.h"
+#include "babl-cpuaccel.h"
+#include "base/util.h"
+#include "extensions/util.h"
+
+#define Q(a) { a, a, a, a }
+
+static const float BABL_ALPHA_THRESHOLD_FLOAT = (float)BABL_ALPHA_THRESHOLD;
+
+static long
+conv_rgbaF_linear_rgbAF_linear (const float *src, float *dst, long samples)
+{
+  long i = 0;
+  long remainder;
+
+  if (((uintptr_t)src % 16) + ((uintptr_t)dst % 16) == 0)
+    {
+      const long    n = (samples / 2) * 2;
+      const __v4sf *s = (const __v4sf*) src;
+            __v4sf *d = (__v4sf*)dst;
+
+      for ( ; i < n; i += 2)
+        {
+          __v4sf rbaa0, rbaa1;
+        
+          __v4sf rgba0 = *s++;
+          __v4sf rgba1 = *s++;
+
+          /* Expand alpha */
+          __v4sf aaaa0 = (__v4sf)_mm_shuffle_epi32((__m128i)rgba0, _MM_SHUFFLE(3, 3, 3, 3));
+          __v4sf aaaa1 = (__v4sf)_mm_shuffle_epi32((__m128i)rgba1, _MM_SHUFFLE(3, 3, 3, 3));
+          
+          /* Premultiply */
+          rgba0 = rgba0 * aaaa0;
+          rgba1 = rgba1 * aaaa1;
+          
+          /* Shuffle the original alpha value back in */
+          rbaa0 = _mm_shuffle_ps(rgba0, aaaa0, _MM_SHUFFLE(0, 0, 2, 0));
+          rbaa1 = _mm_shuffle_ps(rgba1, aaaa1, _MM_SHUFFLE(0, 0, 2, 0));
+          
+          rgba0 = _mm_shuffle_ps(rgba0, rbaa0, _MM_SHUFFLE(2, 1, 1, 0));
+          rgba1 = _mm_shuffle_ps(rgba1, rbaa1, _MM_SHUFFLE(2, 1, 1, 0));
+          
+          *d++ = rgba0;
+          *d++ = rgba1;
+        }
+      _mm_empty ();
+    }
+
+  dst += i * 4;
+  src += i * 4;
+  remainder = samples - i;
+  while (remainder--)
+  {
+    const float a = src[3];
+    dst[0] = src[0] * a;
+    dst[1] = src[1] * a;
+    dst[2] = src[2] * a;
+    dst[3] = a;
+    
+    src += 4;
+    dst += 4;
+  }
+
+  return samples;
+}
+
+static long
+conv_rgbAF_linear_rgbaF_linear_shuffle (const float *src, float *dst, long samples)
+{
+  long i = 0;
+  long remainder;
+
+  if (((uintptr_t)src % 16) + ((uintptr_t)dst % 16) == 0)
+    {
+      const long    n = samples;
+      const __v4sf *s = (const __v4sf*) src;
+            __v4sf *d = (__v4sf*)dst;
+
+      for ( ; i < n; i += 1)
+        {
+          __v4sf pre_rgba0, rgba0, rbaa0, raaaa0;
+          
+          float alpha0 = ((float *)s)[3];
+          pre_rgba0 = *s;
+          
+          if (alpha0 <= 0.0f)
+          {
+            /* Zero RGB */
+            rgba0 = _mm_setzero_ps();
+          }
+          else
+          {
+            float recip0 = 1.0f/alpha0;
+            
+            /* Expand reciprocal */
+            raaaa0 = _mm_load1_ps(&recip0);
+            
+            /* Un-Premultiply */
+            rgba0 = pre_rgba0 * raaaa0;
+          }
+            
+          /* Shuffle the original alpha value back in */
+          rbaa0 = _mm_shuffle_ps(rgba0, pre_rgba0, _MM_SHUFFLE(3, 3, 2, 0));
+          rgba0 = _mm_shuffle_ps(rgba0, rbaa0, _MM_SHUFFLE(2, 1, 1, 0));
+          
+          s++;
+          *d++ = rgba0;
+        }
+      _mm_empty ();
+    }
+
+  dst += i * 4;
+  src += i * 4;
+  remainder = samples - i;
+  while (remainder--)
+    {
+      float alpha = src[3];
+      float recip;
+      if (alpha <= 0.0f)
+        recip = 0.0f;
+      else
+        recip = 1.0f/alpha;
+      dst[0] = src[0] * recip;
+      dst[1] = src[1] * recip;
+      dst[2] = src[2] * recip;
+      dst[3] = alpha;
+      
+      src   += 4;
+      dst   += 4;
+    }
+
+  return samples;
+}
+
+static long
+conv_rgbAF_linear_rgbaF_linear_spin (const float *src, float *dst, long samples)
+{
+  long i = 0;
+  long remainder;
+
+  if (((uintptr_t)src % 16) + ((uintptr_t)dst % 16) == 0)
+    {
+      const long    n = samples;
+      const __v4sf *s = (const __v4sf*) src;
+            __v4sf *d = (__v4sf*)dst;
+      const __v4sf zero = _mm_setzero_ps();
+      const __v4sf one = _mm_set_ss(1.0f);
+
+      for ( ; i < n; i += 1)
+        {
+          __v4sf pre_abgr0, abgr0, rgba0, raaaa0;
+          
+          
+          rgba0 = *s;
+          /* Rotate to ABGR */
+          pre_abgr0 = (__v4sf)_mm_shuffle_epi32((__m128i)rgba0, _MM_SHUFFLE(0, 1, 2, 3));
+          
+          if (_mm_ucomile_ss(pre_abgr0, zero))
+          {
+            /* Zero RGB */
+            abgr0 = zero;
+          }
+          else
+          {
+            /* Un-Premultiply */
+            raaaa0 = _mm_div_ss(one, pre_abgr0);
+            
+            /* Expand reciprocal */
+            raaaa0 = (__v4sf)_mm_shuffle_epi32((__m128i)raaaa0, _MM_SHUFFLE(0, 0, 0, 0));
+            
+            /* Un-Premultiply */
+            abgr0 = pre_abgr0 * raaaa0;
+          }
+          
+          /* Move the original alpha value back in */
+          abgr0 = _mm_move_ss(abgr0, pre_abgr0);
+          
+          /* Rotate to ABGR */
+          rgba0 = (__v4sf)_mm_shuffle_epi32((__m128i)abgr0, _MM_SHUFFLE(0, 1, 2, 3));
+          
+          *d++ = rgba0;
+          s++;
+        }
+      _mm_empty ();
+    }
+
+  dst += i * 4;
+  src += i * 4;
+  remainder = samples - i;
+  while (remainder--)
+    {
+      float alpha = src[3];
+      float recip;
+      if (alpha <= 0.0f)
+        recip = 0.0f;
+      else
+        recip = 1.0f/alpha;
+      dst[0] = src[0] * recip;
+      dst[1] = src[1] * recip;
+      dst[2] = src[2] * recip;
+      dst[3] = alpha;
+      
+      src   += 4;
+      dst   += 4;
+    }
+
+  return samples;
+}
+
+#define splat4f(x) ((__v4sf){x,x,x,x})
+#define splat4i(x) ((__v4si){x,x,x,x})
+#define FLT_ONE 0x3f800000 // ((union {float f; int i;}){1.0f}).i
+#define FLT_MANTISSA (1<<23)
+
+static inline __v4sf
+init_newton (__v4sf x, double exponent, double c0, double c1, double c2)
+{
+    double norm = exponent*M_LN2/FLT_MANTISSA;
+    __v4sf y = _mm_cvtepi32_ps((__m128i)((__v4si)x - splat4i(FLT_ONE)));
+    return splat4f(c0) + splat4f(c1*norm)*y + splat4f(c2*norm*norm)*y*y;
+}
+
+static inline __v4sf
+pow_1_24 (__v4sf x)
+{
+  __v4sf y, z;
+  y = init_newton (x, -1./12, 0.9976800269, 0.9885126933, 0.5908575383);
+  x = _mm_sqrt_ps (x);
+  /* newton's method for x^(-1/6) */
+  z = splat4f (1.f/6.f) * x;
+  y = splat4f (7.f/6.f) * y - z * ((y*y)*(y*y)*(y*y*y));
+  y = splat4f (7.f/6.f) * y - z * ((y*y)*(y*y)*(y*y*y));
+  return x*y;
+}
+
+static inline __v4sf
+pow_24 (__v4sf x)
+{
+  __v4sf y, z;
+  y = init_newton (x, -1./5, 0.9953189663, 0.9594345146, 0.6742970332);
+  /* newton's method for x^(-1/5) */
+  z = splat4f (1.f/5.f) * x;
+  y = splat4f (6.f/5.f) * y - z * ((y*y*y)*(y*y*y));
+  y = splat4f (6.f/5.f) * y - z * ((y*y*y)*(y*y*y));
+  x *= y;
+  return x*x*x;
+}
+
+static inline __v4sf
+linear_to_gamma_2_2_sse2 (__v4sf x)
+{
+  __v4sf curve = pow_1_24 (x) * splat4f (1.055f) - splat4f (0.055f);
+  __v4sf line = x * splat4f (12.92f);
+  __v4sf mask = _mm_cmpgt_ps (x, splat4f (0.003130804954f));
+  return _mm_or_ps (_mm_and_ps (mask, curve), _mm_andnot_ps (mask, line));
+}
+
+static inline __v4sf
+gamma_2_2_to_linear_sse2 (__v4sf x)
+{
+  __v4sf curve = pow_24 ((x + splat4f (0.055f)) * splat4f (1/1.055f));
+  __v4sf line = x * splat4f (1/12.92f);
+  __v4sf mask = _mm_cmpgt_ps (x, splat4f (0.04045f));
+  return _mm_or_ps (_mm_and_ps (mask, curve), _mm_andnot_ps (mask, line));
+}
+
+#define GAMMA_RGBA(func, munge) \
+static long \
+func (const float *src, float *dst, long samples)\
+{\
+  int i = samples;\
+  if (((uintptr_t)src % 16) + ((uintptr_t)dst % 16) == 0)\
+    {\
+      for (; i > 3; i -= 4, src += 16, dst += 16)\
+        {\
+          /* Pack the rgb components from 4 pixels into 3 vectors, gammafy, unpack. */\
+          __v4sf x0 = _mm_load_ps (src);\
+          __v4sf x1 = _mm_load_ps (src+4);\
+          __v4sf x2 = _mm_load_ps (src+8);\
+          __v4sf x3 = _mm_load_ps (src+12);\
+          __v4sf y0 = _mm_movelh_ps (x0, x1);\
+          __v4sf y1 = _mm_movelh_ps (x2, x3);\
+          __v4sf z0 = _mm_unpackhi_ps (x0, x1);\
+          __v4sf z1 = _mm_unpackhi_ps (x2, x3);\
+          __v4sf y2 = _mm_movelh_ps (z0, z1);\
+          __v4sf y3 = _mm_movehl_ps (z1, z0);\
+          y0 = munge (y0);\
+          _mm_storel_pi ((__m64*)(dst), y0);\
+          _mm_storeh_pi ((__m64*)(dst+4), y0);\
+          y1 = munge (y1);\
+          _mm_storel_pi ((__m64*)(dst+8), y1);\
+          _mm_storeh_pi ((__m64*)(dst+12), y1);\
+          y2 = munge (y2);\
+          z0 = _mm_unpacklo_ps (y2, y3);\
+          z1 = _mm_unpackhi_ps (y2, y3);\
+          _mm_storel_pi ((__m64*)(dst+2), z0);\
+          _mm_storeh_pi ((__m64*)(dst+6), z0);\
+          _mm_storel_pi ((__m64*)(dst+10), z1);\
+          _mm_storeh_pi ((__m64*)(dst+14), z1);\
+        }\
+      for (; i > 0; i--, src += 4, dst += 4)\
+        {\
+          __v4sf x = munge (_mm_load_ps (src));\
+          float a = src[3];\
+          _mm_store_ps (dst, x);\
+          dst[3] = a;\
+        }\
+    }\
+  else\
+    {\
+      for (; i > 0; i--, src += 4, dst += 4)\
+        {\
+          __v4sf x = munge (_mm_loadu_ps (src));\
+          float a = src[3];\
+          _mm_storeu_ps (dst, x);\
+          dst[3] = a;\
+        }\
+    }\
+  return samples;\
+}
+
+GAMMA_RGBA(conv_rgbaF_linear_rgbaF_gamma, linear_to_gamma_2_2_sse2)
+GAMMA_RGBA(conv_rgbaF_gamma_rgbaF_linear, gamma_2_2_to_linear_sse2)
+
+#define YA_APPLY(load, store, convert) \
+{ \
+  __v4sf yyaa0, yyaa1; \
+  __v4sf yaya0  = load ((float *)s++); \
+  __v4sf yaya1  = load ((float *)s++); \
+  __v4sf yyyy01 = _mm_shuffle_ps (yaya0, yaya1, _MM_SHUFFLE(0, 2, 0, 2)); \
+\
+  yyyy01 = convert (yyyy01); \
+\
+  yyaa0 = _mm_shuffle_ps (yyyy01, yaya0, _MM_SHUFFLE(3, 1, 0, 1)); \
+  yaya0 = (__v4sf)_mm_shuffle_epi32((__m128i)yyaa0, _MM_SHUFFLE(3, 1, 2, 0)); \
+  yyaa1 = _mm_shuffle_ps (yyyy01, yaya1, _MM_SHUFFLE(3, 1, 2, 3)); \
+  yaya1 = (__v4sf)_mm_shuffle_epi32((__m128i)yyaa1, _MM_SHUFFLE(3, 1, 2, 0)); \
+\
+  store ((float *)d++, yaya0); \
+  store ((float *)d++, yaya1); \
+}\
+
+static long
+conv_yaF_linear_yaF_gamma (const float *src, float *dst, long samples)
+{
+  long total = samples;
+
+  const __v4sf *s = (const __v4sf*)src;
+        __v4sf *d = (__v4sf*)dst;
+
+  if (((uintptr_t)src % 16) + ((uintptr_t)dst % 16) == 0)
+    {
+      while (samples > 4)
+        {
+          YA_APPLY (_mm_load_ps, _mm_store_ps, linear_to_gamma_2_2_sse2);
+          samples -= 4;
+        }
+    }
+  else
+    {
+      while (samples > 4)
+        {
+          YA_APPLY (_mm_loadu_ps, _mm_storeu_ps, linear_to_gamma_2_2_sse2);
+          samples -= 4;
+        }
+    }
+
+  src = (const float *)s;
+  dst = (float *)d;
+
+  while (samples--)
+    {
+      *dst++ = babl_linear_to_gamma_2_2 (*src++);
+      *dst++ = *src++;
+    }
+
+  return total;
+}
+
+
+static long
+conv_yaF_gamma_yaF_linear (const float *src, float *dst, long samples)
+{
+  long total = samples;
+
+  const __v4sf *s = (const __v4sf*)src;
+        __v4sf *d = (__v4sf*)dst;
+
+  if (((uintptr_t)src % 16) + ((uintptr_t)dst % 16) == 0)
+    {
+      while (samples > 4)
+        {
+          YA_APPLY (_mm_load_ps, _mm_store_ps, gamma_2_2_to_linear_sse2);
+          samples -= 4;
+        }
+    }
+  else
+    {
+      while (samples > 4)
+        {
+          YA_APPLY (_mm_loadu_ps, _mm_storeu_ps, gamma_2_2_to_linear_sse2);
+          samples -= 4;
+        }
+    }
+
+  src = (const float *)s;
+  dst = (float *)d;
+
+  while (samples--)
+    {
+      *dst++ = babl_gamma_2_2_to_linear (*src++);
+      *dst++ = *src++;
+    }
+
+  return total;
+}
+
+static inline long
+conv_yF_linear_yF_gamma (const float *src, float *dst, long samples)
+{
+  long total = samples;
+
+  const __v4sf *s = (const __v4sf*)src;
+        __v4sf *d = (__v4sf*)dst;
+
+  if (((uintptr_t)src % 16) + ((uintptr_t)dst % 16) == 0)
+    {
+      while (samples > 4)
+        {
+          __v4sf rgba0 = _mm_load_ps ((float *)s++);
+          rgba0 = linear_to_gamma_2_2_sse2 (rgba0);
+          _mm_store_ps ((float *)d++, rgba0);
+          samples -= 4;
+        }
+    }
+  else
+    {
+      while (samples > 4)
+        {
+          __v4sf rgba0 = _mm_loadu_ps ((float *)s++);
+          rgba0 = linear_to_gamma_2_2_sse2 (rgba0);
+          _mm_storeu_ps ((float *)d++, rgba0);
+          samples -= 4;
+        }
+    }
+
+  src = (const float *)s;
+  dst = (float *)d;
+
+  while (samples--)
+    {
+      *dst++ = babl_linear_to_gamma_2_2 (*src++);
+    }
+
+  return total;
+}
+
+static inline long
+conv_yF_gamma_yF_linear (const float *src, float *dst, long samples)
+{
+  long total = samples;
+
+  const __v4sf *s = (const __v4sf*)src;
+        __v4sf *d = (__v4sf*)dst;
+
+  if (((uintptr_t)src % 16) + ((uintptr_t)dst % 16) == 0)
+    {
+      while (samples > 4)
+        {
+          __v4sf rgba0 = _mm_load_ps ((float *)s++);
+          rgba0 = gamma_2_2_to_linear_sse2 (rgba0);
+          _mm_store_ps ((float *)d++, rgba0);
+          samples -= 4;
+        }
+    }
+  else
+    {
+      while (samples > 4)
+        {
+          __v4sf rgba0 = _mm_loadu_ps ((float *)s++);
+          rgba0 = gamma_2_2_to_linear_sse2 (rgba0);
+          _mm_storeu_ps ((float *)d++, rgba0);
+          samples -= 4;
+        }
+    }
+
+  src = (const float *)s;
+  dst = (float *)d;
+
+  while (samples--)
+    {
+      *dst++ = babl_gamma_2_2_to_linear (*src++);
+    }
+
+  return total;
+}
+
+
+static long
+conv_rgbF_linear_rgbF_gamma (const float *src, float *dst, long samples)
+{
+  return conv_yF_linear_yF_gamma (src, dst, samples * 3) / 3;
+}
+
+
+static long
+conv_rgbF_gamma_rgbF_linear (const float *src, float *dst, long samples)
+{
+  return conv_yF_gamma_yF_linear (src, dst, samples * 3) / 3;
+}
+
+#endif /* defined(USE_SSE2) */
+
+#define o(src, dst) \
+  babl_conversion_new (src, dst, "linear", conv_ ## src ## _ ## dst, NULL)
+
+int init (void);
+
+int
+init (void)
+{
+#if defined(USE_SSE2)
+
+  const Babl *rgbaF_linear = babl_format_new (
+    babl_model ("RGBA"),
+    babl_type ("float"),
+    babl_component ("R"),
+    babl_component ("G"),
+    babl_component ("B"),
+    babl_component ("A"),
+    NULL);
+  const Babl *rgbAF_linear = babl_format_new (
+    babl_model ("RaGaBaA"),
+    babl_type ("float"),
+    babl_component ("Ra"),
+    babl_component ("Ga"),
+    babl_component ("Ba"),
+    babl_component ("A"),
+    NULL);
+  const Babl *rgbaF_gamma = babl_format_new (
+    babl_model ("R'G'B'A"),
+    babl_type ("float"),
+    babl_component ("R'"),
+    babl_component ("G'"),
+    babl_component ("B'"),
+    babl_component ("A"),
+    NULL);
+  const Babl *rgbF_linear = babl_format_new (
+    babl_model ("RGB"),
+    babl_type ("float"),
+    babl_component ("R"),
+    babl_component ("G"),
+    babl_component ("B"),
+    NULL);
+  const Babl *rgbF_gamma = babl_format_new (
+    babl_model ("R'G'B'"),
+    babl_type ("float"),
+    babl_component ("R'"),
+    babl_component ("G'"),
+    babl_component ("B'"),
+    NULL);
+  const Babl *yaF_linear = babl_format_new (
+    babl_model ("YA"),
+    babl_type ("float"),
+    babl_component ("Y"),
+    babl_component ("A"),
+    NULL);
+  const Babl *yaF_gamma = babl_format_new (
+    babl_model ("Y'A"),
+    babl_type ("float"),
+    babl_component ("Y'"),
+    babl_component ("A"),
+    NULL);
+  const Babl *yF_linear = babl_format_new (
+    babl_model ("Y"),
+    babl_type ("float"),
+    babl_component ("Y"),
+    NULL);
+  const Babl *yF_gamma = babl_format_new (
+    babl_model ("Y'"),
+    babl_type ("float"),
+    babl_component ("Y'"),
+    NULL);
+
+  if ((babl_cpu_accel_get_support () & BABL_CPU_ACCEL_X86_SSE) &&
+      (babl_cpu_accel_get_support () & BABL_CPU_ACCEL_X86_SSE2))
+      
+    {
+      babl_conversion_new(rgbaF_linear, 
+                          rgbAF_linear,
+                          "linear",
+                          conv_rgbaF_linear_rgbAF_linear,
+                          NULL);
+                          
+      /* Which of these is faster varies by CPU, and the difference
+       * is big enough that it's worthwhile to include both and
+       * let them fight it out in the babl benchmarks.
+       */
+      babl_conversion_new(rgbAF_linear, 
+                          rgbaF_linear,
+                          "linear",
+                          conv_rgbAF_linear_rgbaF_linear_shuffle,
+                          NULL);
+      babl_conversion_new(rgbAF_linear, 
+                          rgbaF_linear,
+                          "linear",
+                          conv_rgbAF_linear_rgbaF_linear_spin,
+                          NULL);
+
+      o (yF_linear, yF_gamma);
+      o (yF_gamma,  yF_linear);
+
+      o (yaF_linear, yaF_gamma);
+      o (yaF_gamma,  yaF_linear);
+
+      o (rgbF_linear, rgbF_gamma);
+      o (rgbF_gamma,  rgbF_linear);
+
+      o (rgbaF_linear, rgbaF_gamma);
+      o (rgbaF_gamma, rgbaF_linear);
+    }
+
+#endif /* defined(USE_SSE2) */
+
+  return 0;
+}
+
diff --git a/extensions/sse2-int16.c b/extensions/sse2-int16.c
new file mode 100644 (file)
index 0000000..843e030
--- /dev/null
@@ -0,0 +1,214 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2013 Massimo Valentini
+ * Copyright (C) 2013 Daniel Sabo
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#if defined(USE_SSE2)
+
+/* SSE 2 */
+#include <emmintrin.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+
+#include "babl.h"
+#include "babl-cpuaccel.h"
+#include "extensions/util.h"
+
+#define Q(a) { a, a, a, a }
+static const __v4sf  u16_float = Q (1.f / 65535);
+
+static long
+conv_rgba16_rgbaF (const uint16_t *src, float *dst, long samples)
+{
+  long i = 0;
+
+  if (((uintptr_t)src % 16) + ((uintptr_t)dst % 16) == 0)
+    {
+      long           n  = (samples / 2) * 2;
+      const __m128i *s  = (const __m128i*) src;
+            __v4sf  *d  = (__v4sf*) dst;
+
+      for (; i < n / 2; i++)
+        {
+          /* Expand shorts to ints by loading zero in the high bits */
+          const __m128i t0 = _mm_unpacklo_epi16 (s[i + 0], (__m128i)_mm_setzero_ps());
+          const __m128i t1 = _mm_unpackhi_epi16 (s[i + 0], (__m128i)_mm_setzero_ps());
+
+          /* Convert to float */
+          const __m128  u0 = _mm_cvtepi32_ps (t0);
+          const __m128  u1 = _mm_cvtepi32_ps (t1);
+
+          const __v4sf rgba0 = u0 * u16_float;
+          const __v4sf rgba1 = u1 * u16_float;
+
+          d[2 * i + 0] = rgba0;
+          d[2 * i + 1] = rgba1;
+        }
+      _mm_empty();
+    }
+
+  for (i *= 2 * 4; i != 4 * samples; i++)
+    dst[i] = src[i] * (1.f / 65535);
+
+  return samples;
+}
+
+static long
+conv_rgba16_rgbAF (const uint16_t *src, float *dst, long samples)
+{
+  long i = 0;
+  long remainder;
+
+  if (((uintptr_t)src % 16) + ((uintptr_t)dst % 16) == 0)
+    {
+      long           n  = (samples / 2) * 2;
+      const __m128i *s  = (const __m128i*) src;
+            __v4sf  *d  = (__v4sf*) dst;
+
+      const __v4sf  max_mask = { 0.0f, 0.0f, 0.0f, 1.0f };
+
+      for (; i < n / 2; i++)
+        {
+          /* Expand shorts to ints by loading zero in the high bits */
+          const __m128i t0 = _mm_unpacklo_epi16 (s[i + 0], (__m128i)_mm_setzero_ps());
+          const __m128i t1 = _mm_unpackhi_epi16 (s[i + 0], (__m128i)_mm_setzero_ps());
+
+          /* Convert to float */
+          const __m128  u0 = _mm_cvtepi32_ps (t0);
+          const __m128  u1 = _mm_cvtepi32_ps (t1);
+
+          /* Multiply by 1 / 65535 */
+          __v4sf rgba0 = u0 * u16_float;
+          __v4sf rgba1 = u1 * u16_float;
+          
+          /* Expand alpha */
+          __v4sf aaaa0 = (__v4sf)_mm_shuffle_epi32((__m128i)rgba0, _MM_SHUFFLE(3, 3, 3, 3));
+          __v4sf aaaa1 = (__v4sf)_mm_shuffle_epi32((__m128i)rgba1, _MM_SHUFFLE(3, 3, 3, 3));
+          
+          /* Set the value in the alpha slot to 1.0, we know max is sufficent because alpha was a short */
+          aaaa0 = _mm_max_ps(aaaa0, max_mask);
+          aaaa1 = _mm_max_ps(aaaa1, max_mask);
+          
+          /* Premultiply */
+          rgba0 = rgba0 * aaaa0;
+          rgba1 = rgba1 * aaaa1;
+          
+          d[2 * i + 0] = rgba0;
+          d[2 * i + 1] = rgba1;
+        }
+      _mm_empty();
+    }
+
+  dst += i * 2 * 4;
+  src += i * 2 * 4;
+  remainder = samples - (i * 2);
+  while (remainder--)
+  {
+    const float a = src[3] / 65535.0f;
+    const float a_term = a / 65535.0f;
+    dst[0] = src[0] * a_term;
+    dst[1] = src[1] * a_term;
+    dst[2] = src[2] * a_term;
+    dst[3] = a;
+    
+    src += 4;
+    dst += 4;
+  }
+
+  return samples;
+}
+
+#endif /* defined(USE_SSE2) */
+
+int init (void);
+
+int
+init (void)
+{
+#if defined(USE_SSE2)
+
+  const Babl *rgbaF_linear = babl_format_new (
+    babl_model ("RGBA"),
+    babl_type ("float"),
+    babl_component ("R"),
+    babl_component ("G"),
+    babl_component ("B"),
+    babl_component ("A"),
+    NULL);
+  const Babl *rgbAF_linear = babl_format_new (
+    babl_model ("RaGaBaA"),
+    babl_type ("float"),
+    babl_component ("Ra"),
+    babl_component ("Ga"),
+    babl_component ("Ba"),
+    babl_component ("A"),
+    NULL);
+  const Babl *rgba16_linear = babl_format_new (
+    babl_model ("RGBA"),
+    babl_type ("u16"),
+    babl_component ("R"),
+    babl_component ("G"),
+    babl_component ("B"),
+    babl_component ("A"),
+    NULL);
+
+  const Babl *rgbaF_gamma = babl_format_new (
+    babl_model ("R'G'B'A"),
+    babl_type ("float"),
+    babl_component ("R'"),
+    babl_component ("G'"),
+    babl_component ("B'"),
+    babl_component ("A"),
+    NULL);
+  const Babl *rgbAF_gamma = babl_format_new (
+    babl_model ("R'aG'aB'aA"),
+    babl_type ("float"),
+    babl_component ("R'a"),
+    babl_component ("G'a"),
+    babl_component ("B'a"),
+    babl_component ("A"),
+    NULL);
+  const Babl *rgba16_gamma = babl_format_new (
+    babl_model ("R'G'B'A"),
+    babl_type ("u16"),
+    babl_component ("R'"),
+    babl_component ("G'"),
+    babl_component ("B'"),
+    babl_component ("A"),
+    NULL);
+
+#define CONV(src, dst) \
+{ \
+  babl_conversion_new (src ## _linear, dst ## _linear, "linear", conv_ ## src ## _ ## dst, NULL); \
+  babl_conversion_new (src ## _gamma, dst ## _gamma, "linear", conv_ ## src ## _ ## dst, NULL); \
+}
+
+  if ((babl_cpu_accel_get_support () & BABL_CPU_ACCEL_X86_SSE) &&
+      (babl_cpu_accel_get_support () & BABL_CPU_ACCEL_X86_SSE2))
+    {
+      CONV (rgba16, rgbaF);
+      CONV (rgba16, rgbAF);
+    }
+
+#endif /* defined(USE_SSE2) */
+
+  return 0;
+}
+
diff --git a/extensions/sse2-int8.c b/extensions/sse2-int8.c
new file mode 100644 (file)
index 0000000..67ff579
--- /dev/null
@@ -0,0 +1,280 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2013 Daniel Sabo
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#if defined(USE_SSE2)
+
+/* SSE 2 */
+#include <emmintrin.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+
+#include "babl.h"
+#include "babl-cpuaccel.h"
+#include "extensions/util.h"
+
+static inline long
+conv_yF_y8 (const float *src, uint8_t *dst, long samples)
+{
+  const __v4sf *s_vec;
+  __m128i      *d_vec;
+  uint32_t     *d_int;
+
+  long n = samples;
+
+  const __v4sf byte_fill = _mm_set_ps1(255.0f);
+  const __v4sf half      = _mm_set_ps1(0.5);
+
+  while (((uintptr_t)src % 16) && n > 0)
+    {
+      /* Work through the unaligned floats */
+      float y = *src++;
+      *dst++ = (y >= 1.0f) ? 0xFF : ((y <= 0.0f) ? 0x0 : 0xFF * y + 0.5f);
+
+      n -= 1;
+    }
+
+  s_vec = (__v4sf *)src;
+  d_vec = (__m128i *)dst;
+
+  /* Aligned chunks */
+
+  while (n > 16)
+    {
+      __v4sf  yyyy0, yyyy1, yyyy2, yyyy3;
+      __m128i i32_0, i32_1, i32_2, i32_3;
+      __m128i i16_01, i16_23;
+      __m128i mm_ints;
+
+      /* Add 0.5 and truncate, to match C rounding behavior.
+       *
+       * The _mm_min_ps is needed because _mm_packs_epi32 uses
+       * signed saturation, the unsigned version wasn't added
+       * until SSE4.
+       */
+      yyyy0 = *s_vec++ * byte_fill + half;
+      yyyy0 = _mm_min_ps(yyyy0, byte_fill);
+      i32_0 = _mm_cvttps_epi32 ((__m128)yyyy0);
+
+      yyyy1 = *s_vec++ * byte_fill + half;
+      yyyy1 = _mm_min_ps(yyyy1, byte_fill);
+      i32_1 = _mm_cvttps_epi32 ((__m128)yyyy1);
+
+      i16_01 = _mm_packs_epi32 (i32_0, i32_1);
+
+      yyyy2 = *s_vec++ * byte_fill + half;
+      yyyy2 = _mm_min_ps(yyyy2, byte_fill);
+      i32_2 = _mm_cvttps_epi32 ((__m128)yyyy2);
+
+      yyyy3 = *s_vec++ * byte_fill + half;
+      yyyy3 = _mm_min_ps(yyyy3, byte_fill);
+      i32_3 = _mm_cvttps_epi32 ((__m128)yyyy3);
+
+      i16_23 = _mm_packs_epi32 (i32_2, i32_3);
+
+      mm_ints = _mm_packus_epi16 (i16_01, i16_23);
+
+      _mm_storeu_si128 (d_vec++, mm_ints);
+
+      n -= 16;
+    }
+
+  d_int = (uint32_t *)d_vec;
+
+  while (n > 4)
+    {
+      __v4sf  yyyy0;
+      __m128i mm_ints;
+
+      yyyy0 = *s_vec++ * byte_fill + half;
+      yyyy0 = _mm_min_ps(yyyy0, byte_fill);
+      mm_ints = _mm_cvttps_epi32 ((__m128)yyyy0);
+      mm_ints = _mm_packs_epi32 (mm_ints, mm_ints);
+      mm_ints = _mm_packus_epi16 (mm_ints, mm_ints);
+      _mm_store_ss ((float *)d_int++, (__v4sf)mm_ints);
+
+      n -= 4;
+    }
+
+  src = (float *)s_vec;
+  dst = (uint8_t *)d_int;
+
+  while (n > 0)
+    {
+      float y = *src++;
+      *dst++ = (y >= 1.0f) ? 0xFF : ((y <= 0.0f) ? 0x0 : 0xFF * y + 0.5f);
+
+      n -= 1;
+    }
+
+  return samples;
+}
+
+static long
+conv_yaF_ya8 (const float *src, uint8_t *dst, long samples)
+{
+  return conv_yF_y8 (src, dst, samples * 2) / 2;
+}
+
+
+static long
+conv_rgbF_rgb8 (const float *src, uint8_t *dst, long samples)
+{
+  return conv_yF_y8 (src, dst, samples * 3) / 3;
+}
+
+static long
+conv_rgbaF_rgba8 (const float *src, uint8_t *dst, long samples)
+{
+  return conv_yF_y8 (src, dst, samples * 4) / 4;
+}
+
+#endif
+
+int init (void);
+
+int
+init (void)
+{
+#if defined(USE_SSE2)
+  const Babl *rgbaF_linear = babl_format_new (
+    babl_model ("RGBA"),
+    babl_type ("float"),
+    babl_component ("R"),
+    babl_component ("G"),
+    babl_component ("B"),
+    babl_component ("A"),
+    NULL);
+  const Babl *rgba8_linear = babl_format_new (
+    babl_model ("RGBA"),
+    babl_type ("u8"),
+    babl_component ("R"),
+    babl_component ("G"),
+    babl_component ("B"),
+    babl_component ("A"),
+    NULL);
+  const Babl *rgbaF_gamma = babl_format_new (
+    babl_model ("R'G'B'A"),
+    babl_type ("float"),
+    babl_component ("R'"),
+    babl_component ("G'"),
+    babl_component ("B'"),
+    babl_component ("A"),
+    NULL);
+  const Babl *rgba8_gamma = babl_format_new (
+    babl_model ("R'G'B'A"),
+    babl_type ("u8"),
+    babl_component ("R'"),
+    babl_component ("G'"),
+    babl_component ("B'"),
+    babl_component ("A"),
+    NULL);
+  const Babl *rgbF_linear = babl_format_new (
+    babl_model ("RGB"),
+    babl_type ("float"),
+    babl_component ("R"),
+    babl_component ("G"),
+    babl_component ("B"),
+    NULL);
+  const Babl *rgb8_linear = babl_format_new (
+    babl_model ("RGB"),
+    babl_type ("u8"),
+    babl_component ("R"),
+    babl_component ("G"),
+    babl_component ("B"),
+    NULL);
+  const Babl *rgbF_gamma = babl_format_new (
+    babl_model ("R'G'B'"),
+    babl_type ("float"),
+    babl_component ("R'"),
+    babl_component ("G'"),
+    babl_component ("B'"),
+    NULL);
+  const Babl *rgb8_gamma = babl_format_new (
+    babl_model ("R'G'B'"),
+    babl_type ("u8"),
+    babl_component ("R'"),
+    babl_component ("G'"),
+    babl_component ("B'"),
+    NULL);
+  const Babl *yaF_linear = babl_format_new (
+    babl_model ("YA"),
+    babl_type ("float"),
+    babl_component ("Y"),
+    babl_component ("A"),
+    NULL);
+  const Babl *ya8_linear = babl_format_new (
+    babl_model ("YA"),
+    babl_type ("u8"),
+    babl_component ("Y"),
+    babl_component ("A"),
+    NULL);
+  const Babl *yaF_gamma = babl_format_new (
+    babl_model ("Y'A"),
+    babl_type ("float"),
+    babl_component ("Y'"),
+    babl_component ("A"),
+    NULL);
+  const Babl *ya8_gamma = babl_format_new (
+    babl_model ("Y'A"),
+    babl_type ("u8"),
+    babl_component ("Y'"),
+    babl_component ("A"),
+    NULL);
+  const Babl *yF_linear = babl_format_new (
+    babl_model ("Y"),
+    babl_type ("float"),
+    babl_component ("Y"),
+    NULL);
+  const Babl *y8_linear = babl_format_new (
+    babl_model ("Y"),
+    babl_type ("u8"),
+    babl_component ("Y"),
+    NULL);
+  const Babl *yF_gamma = babl_format_new (
+    babl_model ("Y'"),
+    babl_type ("float"),
+    babl_component ("Y'"),
+    NULL);
+  const Babl *y8_gamma = babl_format_new (
+    babl_model ("Y'"),
+    babl_type ("u8"),
+    babl_component ("Y'"),
+    NULL);
+
+#define CONV(src, dst) \
+{ \
+  babl_conversion_new (src ## _linear, dst ## _linear, "linear", conv_ ## src ## _ ## dst, NULL); \
+  babl_conversion_new (src ## _gamma, dst ## _gamma, "linear", conv_ ## src ## _ ## dst, NULL); \
+}
+
+  if ((babl_cpu_accel_get_support () & BABL_CPU_ACCEL_X86_SSE2))
+    {
+      CONV(rgbaF, rgba8);
+      CONV(rgbF,  rgb8);
+      CONV(yaF,   ya8);
+      CONV(yF,    y8);
+    }
+
+#endif
+
+  return 0;
+}
+
diff --git a/extensions/two-table-tables.h b/extensions/two-table-tables.h
new file mode 100644 (file)
index 0000000..528d3f6
--- /dev/null
@@ -0,0 +1,3444 @@
+/* Gamma table generated from a babl conversion of Y to Y' */
+static const unsigned char linear_to_gamma[65536] =
+{
+0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,
+4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,
+6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,
+8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,
+10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,
+11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
+13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,
+14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+15,15,15,15,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
+17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,
+18,18,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,
+19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,
+20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,
+21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,
+21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,
+22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,
+23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,
+24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,
+24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,
+25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,
+26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,
+26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,
+27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,
+27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,
+28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,
+29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,
+29,29,29,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,
+30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,
+30,30,30,30,30,30,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,
+31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,
+31,31,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,33,
+33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,
+33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,34,34,
+34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,
+34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,35,35,
+35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
+35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
+36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,
+36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,
+36,36,36,36,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,
+37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,
+37,37,37,37,37,37,37,37,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,39,39,39,39,39,39,39,39,39,39,
+39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,
+39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,40,40,40,
+40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,
+40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,
+40,40,40,40,40,40,40,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,
+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,
+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,42,42,42,42,42,42,42,
+42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,
+42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,
+42,42,42,42,42,42,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
+43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
+43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,44,44,44,44,44,44,
+44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,
+44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,
+44,44,44,44,44,44,44,44,44,44,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,
+45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,
+45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,
+45,45,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,
+46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,
+46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,47,47,47,47,
+47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,
+47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,
+47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,48,48,48,48,48,48,48,48,48,
+48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,
+48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,
+48,48,48,48,48,48,48,48,48,48,48,48,48,48,49,49,49,49,49,49,49,49,49,49,49,49,
+49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,
+49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,
+49,49,49,49,49,49,49,49,49,49,49,49,49,50,50,50,50,50,50,50,50,50,50,50,50,50,
+50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
+50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
+50,50,50,50,50,50,50,50,50,50,50,50,50,51,51,51,51,51,51,51,51,51,51,51,51,51,
+51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,
+51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,
+51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,52,52,52,52,52,52,52,52,52,52,52,
+52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,
+52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,
+52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,53,53,53,53,53,53,53,
+53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,
+53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,
+53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,54,
+54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,
+54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,
+54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,
+54,54,54,54,54,54,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,
+55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,
+55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,
+55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,56,56,56,56,56,56,56,56,56,56,56,
+56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,
+56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,
+56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,
+57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,
+57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,
+57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,
+57,57,57,57,57,57,57,57,57,57,57,57,58,58,58,58,58,58,58,58,58,58,58,58,58,58,
+58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,
+58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,
+58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,
+58,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,
+59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,
+59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,
+59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,60,60,60,60,60,60,60,60,60,
+60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,
+60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,
+60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,
+60,60,60,60,60,60,60,60,60,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,
+61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,
+61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,
+61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,
+61,61,61,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,
+62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,
+62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,
+62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,63,63,
+63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,
+63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,
+63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,
+63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,64,64,64,64,
+64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
+64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
+64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
+64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,65,65,65,65,65,
+65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,
+65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,
+65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,
+65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,66,66,66,
+66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,
+66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,
+66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,
+66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,
+67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,
+67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,
+67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,
+67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,
+67,67,67,67,67,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,
+68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,
+68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,
+68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,
+68,68,68,68,68,68,68,68,68,68,68,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,
+69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,
+69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,
+69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,
+69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,70,70,70,70,70,70,
+70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,
+70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,
+70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,
+70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,
+70,70,70,70,70,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,
+71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,
+71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,
+71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,
+71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,72,72,72,72,72,72,72,72,72,
+72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,
+72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,
+72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,
+72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,
+72,72,72,72,72,72,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,
+73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,
+73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,
+73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,
+73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,74,74,74,74,
+74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,
+74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,
+74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,
+74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,
+74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,75,75,75,75,75,75,75,75,75,75,
+75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,
+75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,
+75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,
+75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,
+75,75,75,75,75,75,75,75,75,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,
+76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,
+76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,
+76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,
+76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,
+76,76,76,76,76,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,
+77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,
+77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,
+77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,
+77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,
+77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,
+78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,
+78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,
+78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,
+78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,
+78,78,78,78,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,
+79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,
+79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,
+79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,
+79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,
+79,79,79,79,79,79,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,
+80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,
+80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,
+80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,
+80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,
+80,80,80,80,80,80,80,80,80,80,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,
+81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,
+81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,
+81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,
+81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,
+81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,82,82,82,82,82,82,82,82,82,82,
+82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,
+82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,
+82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,
+82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,
+82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,83,83,
+83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,
+83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,
+83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,
+83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,
+83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,
+83,83,83,83,83,83,83,83,83,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,
+84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,
+84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,
+84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,
+84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,
+84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,85,85,85,85,85,
+85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,
+85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,
+85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,
+85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,
+85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,
+85,85,85,85,85,85,85,85,85,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,
+86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,
+86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,
+86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,
+86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,
+86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,
+87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,
+87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,
+87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,
+87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,
+87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,
+87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,88,88,88,88,88,88,88,88,
+88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,
+88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,
+88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,
+88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,
+88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,
+88,88,88,88,88,88,88,88,88,88,88,88,89,89,89,89,89,89,89,89,89,89,89,89,89,89,
+89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,
+89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,
+89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,
+89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,
+89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,
+89,89,89,89,89,89,89,89,89,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,
+90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,
+90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,
+90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,
+90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,
+90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,
+90,90,90,90,90,90,90,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,
+91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,
+91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,
+91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,
+91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,
+91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,
+91,91,91,91,91,91,91,91,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,
+93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,
+93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,
+93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,
+93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,
+93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,
+93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,94,94,94,94,94,94,94,94,94,94,
+94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,
+94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,
+94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,
+94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,
+94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,
+94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,95,95,95,
+95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,
+95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,
+95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,
+95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,
+95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,
+95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,
+95,95,95,95,95,95,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,
+96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,
+96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,
+96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,
+96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,
+96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,
+96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,97,97,97,97,97,97,97,97,97,
+97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,
+97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,
+97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,
+97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,
+97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,
+97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,
+97,97,97,97,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,
+98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,
+98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,
+98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,
+98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,
+98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,
+98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,99,99,99,99,99,99,
+99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,
+99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,
+99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,
+99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,
+99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,
+99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,
+99,99,99,99,99,99,99,99,99,99,99,99,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,
+101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,
+101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,
+101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,
+101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,
+101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,
+101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,
+101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,
+101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,
+101,101,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+102,102,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,
+103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,
+103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,
+103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,
+103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,
+103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,
+103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,
+103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,
+103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,
+103,103,103,103,103,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,
+104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,
+104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,
+104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,
+104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,
+104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,
+104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,
+104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,
+104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,
+104,104,104,104,104,104,104,104,104,105,105,105,105,105,105,105,105,105,105,105,
+105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,
+105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,
+105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,
+105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,
+105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,
+105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,
+105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,
+105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,
+105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,106,106,106,106,
+106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,
+106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,
+106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,
+106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,
+106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,
+106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,
+106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,
+106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,
+106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,
+106,106,106,106,106,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,
+107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,
+107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,
+107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,
+107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,
+107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,
+107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,
+107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,
+107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,
+107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,108,108,108,108,
+108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+108,108,108,108,108,108,108,108,108,109,109,109,109,109,109,109,109,109,109,109,
+109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
+109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
+109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
+109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
+109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
+109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
+109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
+109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
+109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
+109,109,109,109,109,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+111,111,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
+112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
+112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
+112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
+112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
+112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
+112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
+112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
+112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
+112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
+112,112,112,112,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,114,114,
+114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
+114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
+114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
+114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
+114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
+114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
+114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
+114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
+114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
+114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,
+116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,
+116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,
+116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,
+116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,
+116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,
+116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,
+116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,
+116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,
+116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,
+116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,117,117,117,117,
+117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,
+117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,
+117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,
+117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,
+117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,
+117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,
+117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,
+117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,
+117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,
+117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,
+117,117,117,117,117,117,117,117,117,118,118,118,118,118,118,118,118,118,118,118,
+118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,
+118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,
+118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,
+118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,
+118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,
+118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,
+118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,
+118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,
+118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,
+118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,
+118,118,118,118,118,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+119,119,119,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,
+121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,
+121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,
+121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,
+121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,
+121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,
+121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,
+121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,
+121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,
+121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,
+121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,
+121,121,121,121,121,121,121,122,122,122,122,122,122,122,122,122,122,122,122,122,
+122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,
+122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,
+122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,
+122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,
+122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,
+122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,
+122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,
+122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,
+122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,
+122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,
+122,122,122,122,122,122,122,122,122,122,122,122,123,123,123,123,123,123,123,123,
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,124,
+124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,
+124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,
+124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,
+124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,
+124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,
+124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,
+124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,
+124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,
+124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,
+124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,
+124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,
+124,124,124,124,124,124,124,124,124,125,125,125,125,125,125,125,125,125,125,125,
+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,
+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,
+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,
+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,
+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,
+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,
+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,
+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,
+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,
+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,
+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,
+125,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,
+126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,
+126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,
+126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,
+126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,
+126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,
+126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,
+126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,
+126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,
+126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,
+126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,
+126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,127,127,127,127,127,
+127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
+127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
+127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
+127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
+127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
+127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
+127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
+127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
+127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
+127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
+127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
+127,127,127,127,127,127,127,127,127,127,127,127,128,128,128,128,128,128,128,128,
+128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
+128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
+128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
+128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
+128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
+128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
+128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
+128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
+128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
+128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
+128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
+128,128,128,128,128,128,128,128,128,128,128,129,129,129,129,129,129,129,129,129,
+129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,
+129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,
+129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,
+129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,
+129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,
+129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,
+129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,
+129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,
+129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,
+129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,
+129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,
+129,129,129,129,129,129,129,129,129,129,129,129,130,130,130,130,130,130,130,130,
+130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,
+130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,
+130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,
+130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,
+130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,
+130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,
+130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,
+130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,
+130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,
+130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,
+130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,
+130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,131,131,131,131,
+131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
+131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
+131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
+131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
+131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
+131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
+131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
+131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
+131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
+131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
+131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
+131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
+131,131,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
+132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
+132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
+132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
+132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
+132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
+132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
+132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
+132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
+132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
+132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
+132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
+132,132,132,132,132,132,132,132,132,132,132,133,133,133,133,133,133,133,133,133,
+133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,
+133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,
+133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,
+133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,
+133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,
+133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,
+133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,
+133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,
+133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,
+133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,
+133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,
+133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,
+133,133,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
+134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
+134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
+134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
+134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
+134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
+134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
+134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
+134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
+134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
+134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
+134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
+134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,135,135,135,135,135,
+135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
+135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
+135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
+135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
+135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
+135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
+135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
+135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
+135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
+135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
+135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
+135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
+135,135,135,135,135,135,135,135,135,135,135,136,136,136,136,136,136,136,136,136,
+136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,
+136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,
+136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,
+136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,
+136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,
+136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,
+136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,
+136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,
+136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,
+136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,
+136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,
+136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,
+136,136,136,136,136,136,136,136,136,137,137,137,137,137,137,137,137,137,137,137,
+137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,
+137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,
+137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,
+137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,
+137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,
+137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,
+137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,
+137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,
+137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,
+137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,
+137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,
+137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,
+137,137,137,137,137,137,137,137,137,138,138,138,138,138,138,138,138,138,138,138,
+138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
+138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
+138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
+138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
+138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
+138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
+138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
+138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
+138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
+138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
+138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
+138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
+138,138,138,138,138,138,138,138,138,138,138,138,139,139,139,139,139,139,139,139,
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,140,140,
+140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
+140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
+140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
+140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
+140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
+140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
+140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
+140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
+140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
+140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
+140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
+140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
+140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
+140,140,140,140,140,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,142,142,142,142,
+142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
+142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
+142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
+142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
+142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
+142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
+142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
+142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
+142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
+142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
+142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
+142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
+142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
+142,142,142,142,142,142,142,142,143,143,143,143,143,143,143,143,143,143,143,143,
+143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+143,143,143,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
+144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
+144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
+144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
+144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
+144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
+144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
+144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
+144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
+144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
+144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
+144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
+144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
+144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
+144,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,
+145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,
+145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,
+145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,
+145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,
+145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,
+145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,
+145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,
+145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,
+145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,
+145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,
+145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,
+145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,
+145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,
+145,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
+146,146,146,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
+147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
+147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
+147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
+147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
+147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
+147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
+147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
+147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
+147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
+147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
+147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
+147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
+147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
+147,147,147,147,147,147,147,147,148,148,148,148,148,148,148,148,148,148,148,148,
+148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,
+148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,
+148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,
+148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,
+148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,
+148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,
+148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,
+148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,
+148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,
+148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,
+148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,
+148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,
+148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,
+148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,149,149,149,149,
+149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
+149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
+149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
+149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
+149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
+149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
+149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
+149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
+149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
+149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
+149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
+149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
+149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
+149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
+149,149,149,149,149,149,150,150,150,150,150,150,150,150,150,150,150,150,150,150,
+150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,
+150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,
+150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,
+150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,
+150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,
+150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,
+150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,
+150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,
+150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,
+150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,
+150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,
+150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,
+150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,
+150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,151,151,
+151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
+151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
+151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
+151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
+151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
+151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
+151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
+151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
+151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
+151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
+151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
+151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
+151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
+151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
+151,151,151,151,151,151,151,151,151,151,151,151,151,152,152,152,152,152,152,152,
+152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,
+152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,
+152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,
+152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,
+152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,
+152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,
+152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,
+152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,
+152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,
+152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,
+152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,
+152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,
+152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,
+152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,
+152,152,152,152,152,152,152,152,152,152,152,153,153,153,153,153,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,154,154,154,154,154,154,154,154,154,
+154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
+154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
+154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
+154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
+154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
+154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
+154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
+154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
+154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
+154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
+154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
+154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
+154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
+154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
+154,154,154,154,154,154,154,154,154,154,154,154,154,155,155,155,155,155,155,155,
+155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,
+155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,
+155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,
+155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,
+155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,
+155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,
+155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,
+155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,
+155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,
+155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,
+155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,
+155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,
+155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,
+155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,
+155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,156,156,
+156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
+156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
+156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
+156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
+156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
+156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
+156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
+156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
+156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
+156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
+156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
+156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
+156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
+156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
+156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
+156,156,156,156,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,
+157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,
+157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,
+157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,
+157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,
+157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,
+157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,
+157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,
+157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,
+157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,
+157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,
+157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,
+157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,
+157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,
+157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,
+157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,158,158,158,
+158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
+158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
+158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
+158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
+158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
+158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
+158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
+158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
+158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
+158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
+158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
+158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
+158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
+158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
+158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
+158,158,158,158,158,158,158,158,159,159,159,159,159,159,159,159,159,159,159,159,
+159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
+159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
+159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
+159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
+159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
+159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
+159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
+159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
+159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
+159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
+159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
+159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
+159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
+159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
+159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
+159,159,159,159,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+160,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+161,161,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+162,162,162,162,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,164,164,164,164,164,164,164,164,164,164,
+164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,165,165,
+165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+165,165,165,165,165,165,165,165,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+166,166,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+174,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+179,179,179,179,179,179,179,179,179,179,179,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+180,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+181,181,181,181,181,181,181,181,181,181,181,181,181,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+183,183,183,183,183,183,183,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+184,184,184,184,184,184,184,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+187,187,187,187,187,187,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+191,191,191,191,191,191,191,191,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+192,192,192,192,192,192,192,192,192,192,192,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,
+194,194,194,194,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
+195,195,195,195,195,195,195,195,195,195,195,195,195,195,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,
+196,196,196,196,196,196,196,196,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,
+197,197,197,197,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
+198,198,198,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,
+201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
+202,202,202,202,202,202,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+204,204,204,204,204,204,204,204,204,204,204,204,204,204,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,
+208,208,208,208,208,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
+209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
+211,211,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,
+213,213,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
+214,214,214,214,214,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,215,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,
+216,216,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,
+217,217,217,217,217,217,217,217,217,217,217,217,217,217,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
+218,218,218,218,218,218,218,218,218,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,
+220,220,220,220,220,220,220,220,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+221,221,221,221,221,221,221,221,221,221,221,221,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,
+226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,
+227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,
+229,229,229,229,229,229,229,229,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,
+231,231,231,231,231,231,231,231,231,231,231,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,
+232,232,232,232,232,232,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+233,233,233,233,233,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
+234,234,234,234,234,234,234,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,235,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,
+237,237,237,237,237,237,237,237,237,237,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,
+241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,
+243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
+244,244,244,244,244,244,244,244,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,
+246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,249,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,
+250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
+251,251,251,251,251,251,251,251,251,251,251,251,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,252,252,252,252,252,252,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+253,253,253,253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
+};
+
+static const float u8_gamma_minimums[257] =
+{
+0.0,
+0x1.3e6p-13, /* 0.000152, 1 */
+0x1.dd7p-12, /* 0.000455, 2 */
+0x1.8dd8p-11, /* 0.000759, 3 */
+0x1.168p-10, /* 0.001062, 4 */
+0x1.661p-10, /* 0.001366, 5 */
+0x1.b5ap-10, /* 0.001669, 6 */
+0x1.029ap-9, /* 0.001973, 7 */
+0x1.2a62p-9, /* 0.002276, 8 */
+0x1.522ap-9, /* 0.002580, 9 */
+0x1.79f4p-9, /* 0.002884, 10 */
+0x1.a1e6p-9, /* 0.003188, 11 */
+0x1.cbf8p-9, /* 0.003509, 12 */
+0x1.f86ap-9, /* 0.003848, 13 */
+0x1.13a1p-8, /* 0.004206, 14 */
+0x1.2c47p-8, /* 0.004582, 15 */
+0x1.462ap-8, /* 0.004977, 16 */
+0x1.614fp-8, /* 0.005391, 17 */
+0x1.7dbap-8, /* 0.005825, 18 */
+0x1.9b6fp-8, /* 0.006278, 19 */
+0x1.ba73p-8, /* 0.006751, 20 */
+0x1.dacap-8, /* 0.007245, 21 */
+0x1.fc77p-8, /* 0.007759, 22 */
+0x1.0fbf8p-7, /* 0.008293, 23 */
+0x1.21f28p-7, /* 0.008848, 24 */
+0x1.34d68p-7, /* 0.009425, 25 */
+0x1.486ep-7, /* 0.010023, 26 */
+0x1.5cbap-7, /* 0.010642, 27 */
+0x1.71bc8p-7, /* 0.011283, 28 */
+0x1.87778p-7, /* 0.011947, 29 */
+0x1.9dedp-7, /* 0.012632, 30 */
+0x1.b51ep-7, /* 0.013340, 31 */
+0x1.cd0dp-7, /* 0.014070, 32 */
+0x1.e5bbp-7, /* 0.014823, 33 */
+0x1.ff2a8p-7, /* 0.015600, 34 */
+0x1.0cae4p-6, /* 0.016399, 35 */
+0x1.1a294p-6, /* 0.017222, 36 */
+0x1.28074p-6, /* 0.018068, 37 */
+0x1.3649p-6, /* 0.018938, 38 */
+0x1.44ef8p-6, /* 0.019832, 39 */
+0x1.53fbp-6, /* 0.020751, 40 */
+0x1.636ccp-6, /* 0.021693, 41 */
+0x1.73454p-6, /* 0.022661, 42 */
+0x1.83858p-6, /* 0.023652, 43 */
+0x1.942dcp-6, /* 0.024669, 44 */
+0x1.a53f8p-6, /* 0.025711, 45 */
+0x1.b6bacp-6, /* 0.026778, 46 */
+0x1.c8a08p-6, /* 0.027870, 47 */
+0x1.daf18p-6, /* 0.028988, 48 */
+0x1.edae8p-6, /* 0.030132, 49 */
+0x1.006cp-5, /* 0.031301, 50 */
+0x1.0a378p-5, /* 0.032497, 51 */
+0x1.1439ep-5, /* 0.033719, 52 */
+0x1.1e73ap-5, /* 0.034967, 53 */
+0x1.28e52p-5, /* 0.036242, 54 */
+0x1.338eap-5, /* 0.037544, 55 */
+0x1.3e706p-5, /* 0.038872, 56 */
+0x1.498aep-5, /* 0.040227, 57 */
+0x1.54de6p-5, /* 0.041610, 58 */
+0x1.606b2p-5, /* 0.043020, 59 */
+0x1.6c318p-5, /* 0.044457, 60 */
+0x1.7831ep-5, /* 0.045922, 61 */
+0x1.846c8p-5, /* 0.047415, 62 */
+0x1.90e1ap-5, /* 0.048936, 63 */
+0x1.9d91ap-5, /* 0.050484, 64 */
+0x1.aa7dp-5, /* 0.052062, 65 */
+0x1.b7a3cp-5, /* 0.053667, 66 */
+0x1.c5064p-5, /* 0.055301, 67 */
+0x1.d2a4ep-5, /* 0.056963, 68 */
+0x1.e08p-5, /* 0.058655, 69 */
+0x1.ee97ap-5, /* 0.060375, 70 */
+0x1.fcec6p-5, /* 0.062124, 71 */
+0x1.05bf3p-4, /* 0.063903, 72 */
+0x1.0d26fp-4, /* 0.065711, 73 */
+0x1.14adap-4, /* 0.067548, 74 */
+0x1.1c536p-4, /* 0.069415, 75 */
+0x1.24185p-4, /* 0.071312, 76 */
+0x1.2bfcap-4, /* 0.073239, 77 */
+0x1.34007p-4, /* 0.075196, 78 */
+0x1.3c23ep-4, /* 0.077183, 79 */
+0x1.44671p-4, /* 0.079200, 80 */
+0x1.4cca3p-4, /* 0.081248, 81 */
+0x1.554d5p-4, /* 0.083326, 82 */
+0x1.5df0ap-4, /* 0.085435, 83 */
+0x1.66b44p-4, /* 0.087574, 84 */
+0x1.6f984p-4, /* 0.089745, 85 */
+0x1.789cep-4, /* 0.091946, 86 */
+0x1.81c23p-4, /* 0.094179, 87 */
+0x1.8b085p-4, /* 0.096443, 88 */
+0x1.946f7p-4, /* 0.098739, 89 */
+0x1.9df7bp-4, /* 0.101066, 90 */
+0x1.a7a12p-4, /* 0.103425, 91 */
+0x1.b16bfp-4, /* 0.105816, 92 */
+0x1.bb584p-4, /* 0.108238, 93 */
+0x1.c5662p-4, /* 0.110693, 94 */
+0x1.cf95cp-4, /* 0.113180, 95 */
+0x1.d9e74p-4, /* 0.115699, 96 */
+0x1.e45abp-4, /* 0.118251, 97 */
+0x1.eef03p-4, /* 0.120835, 98 */
+0x1.f9a8p-4, /* 0.123451, 99 */
+0x1.02411p-3, /* 0.126101, 100 */
+0x1.07bf68p-3, /* 0.128783, 101 */
+0x1.0d4f08p-3, /* 0.131498, 102 */
+0x1.12eff8p-3, /* 0.134247, 103 */
+0x1.18a25p-3, /* 0.137028, 104 */
+0x1.1e6628p-3, /* 0.139843, 105 */
+0x1.243b88p-3, /* 0.142692, 106 */
+0x1.2a228p-3, /* 0.145574, 107 */
+0x1.301b28p-3, /* 0.148489, 108 */
+0x1.36258p-3, /* 0.151439, 109 */
+0x1.3c41ap-3, /* 0.154422, 110 */
+0x1.426f98p-3, /* 0.157439, 111 */
+0x1.48af7p-3, /* 0.160491, 112 */
+0x1.4f014p-3, /* 0.163577, 113 */
+0x1.556508p-3, /* 0.166697, 114 */
+0x1.5bdaep-3, /* 0.169851, 115 */
+0x1.6262dp-3, /* 0.173040, 116 */
+0x1.68fcfp-3, /* 0.176264, 117 */
+0x1.6fa948p-3, /* 0.179522, 118 */
+0x1.7667ep-3, /* 0.182815, 119 */
+0x1.7d38d8p-3, /* 0.186144, 120 */
+0x1.841c28p-3, /* 0.189507, 121 */
+0x1.8b11f8p-3, /* 0.192905, 122 */
+0x1.921a4p-3, /* 0.196339, 123 */
+0x1.99352p-3, /* 0.199808, 124 */
+0x1.a06298p-3, /* 0.203313, 125 */
+0x1.a7a2b8p-3, /* 0.206853, 126 */
+0x1.aef598p-3, /* 0.210429, 127 */
+0x1.b65b38p-3, /* 0.214041, 128 */
+0x1.bdd3bp-3, /* 0.217689, 129 */
+0x1.c55f08p-3, /* 0.221373, 130 */
+0x1.ccfd5p-3, /* 0.225093, 131 */
+0x1.d4ae88p-3, /* 0.228849, 132 */
+0x1.dc72dp-3, /* 0.232641, 133 */
+0x1.e44a28p-3, /* 0.236470, 134 */
+0x1.ec34ap-3, /* 0.240335, 135 */
+0x1.f43258p-3, /* 0.244237, 136 */
+0x1.fc435p-3, /* 0.248175, 137 */
+0x1.0233c4p-2, /* 0.252151, 138 */
+0x1.064f98p-2, /* 0.256163, 139 */
+0x1.0a7518p-2, /* 0.260212, 140 */
+0x1.0ea45p-2, /* 0.264299, 141 */
+0x1.12dd44p-2, /* 0.268422, 142 */
+0x1.172p-2, /* 0.272583, 143 */
+0x1.1b6c84p-2, /* 0.276781, 144 */
+0x1.1fc2ep-2, /* 0.281017, 145 */
+0x1.242314p-2, /* 0.285290, 146 */
+0x1.288d28p-2, /* 0.289601, 147 */
+0x1.2d0124p-2, /* 0.293950, 148 */
+0x1.317f0cp-2, /* 0.298336, 149 */
+0x1.3606e8p-2, /* 0.302761, 150 */
+0x1.3a98cp-2, /* 0.307223, 151 */
+0x1.3f3498p-2, /* 0.311724, 152 */
+0x1.43da74p-2, /* 0.316263, 153 */
+0x1.488a5cp-2, /* 0.320840, 154 */
+0x1.4d4454p-2, /* 0.325456, 155 */
+0x1.520864p-2, /* 0.330110, 156 */
+0x1.56d694p-2, /* 0.334803, 157 */
+0x1.5baee8p-2, /* 0.339534, 158 */
+0x1.60916p-2, /* 0.344305, 159 */
+0x1.657e0cp-2, /* 0.349114, 160 */
+0x1.6a74fp-2, /* 0.353962, 161 */
+0x1.6f760cp-2, /* 0.358849, 162 */
+0x1.748168p-2, /* 0.363775, 163 */
+0x1.79971p-2, /* 0.368740, 164 */
+0x1.7eb704p-2, /* 0.373745, 165 */
+0x1.83e15p-2, /* 0.378789, 166 */
+0x1.8915fp-2, /* 0.383873, 167 */
+0x1.8e54f4p-2, /* 0.388996, 168 */
+0x1.939e6p-2, /* 0.394159, 169 */
+0x1.98f238p-2, /* 0.399361, 170 */
+0x1.9e508p-2, /* 0.404604, 171 */
+0x1.a3b94p-2, /* 0.409886, 172 */
+0x1.a92c8p-2, /* 0.415209, 173 */
+0x1.aeaa44p-2, /* 0.420571, 174 */
+0x1.b4329p-2, /* 0.425974, 175 */
+0x1.b9c56cp-2, /* 0.431417, 176 */
+0x1.bf62d8p-2, /* 0.436900, 177 */
+0x1.c50aep-2, /* 0.442424, 178 */
+0x1.cabd88p-2, /* 0.447989, 179 */
+0x1.d07ad4p-2, /* 0.453594, 180 */
+0x1.d642c8p-2, /* 0.459239, 181 */
+0x1.dc156cp-2, /* 0.464925, 182 */
+0x1.e1f2c4p-2, /* 0.470653, 183 */
+0x1.e7dad8p-2, /* 0.476421, 184 */
+0x1.edcdacp-2, /* 0.482230, 185 */
+0x1.f3cb4cp-2, /* 0.488080, 186 */
+0x1.f9d3bcp-2, /* 0.493972, 187 */
+0x1.ffe70cp-2, /* 0.499905, 188 */
+0x1.03028cp-1, /* 0.505879, 189 */
+0x1.06170ap-1, /* 0.511895, 190 */
+0x1.0930f8p-1, /* 0.517952, 191 */
+0x1.0c5058p-1, /* 0.524050, 192 */
+0x1.0f752ep-1, /* 0.530191, 193 */
+0x1.129f7cp-1, /* 0.536373, 194 */
+0x1.15cf44p-1, /* 0.542597, 195 */
+0x1.19048cp-1, /* 0.548863, 196 */
+0x1.1c3f56p-1, /* 0.555171, 197 */
+0x1.1f7fa4p-1, /* 0.561521, 198 */
+0x1.22c578p-1, /* 0.567913, 199 */
+0x1.2610d8p-1, /* 0.574347, 200 */
+0x1.2961c2p-1, /* 0.580824, 201 */
+0x1.2cb83ep-1, /* 0.587343, 202 */
+0x1.30144cp-1, /* 0.593905, 203 */
+0x1.3375eep-1, /* 0.600509, 204 */
+0x1.36dd26p-1, /* 0.607156, 205 */
+0x1.3a49fap-1, /* 0.613846, 206 */
+0x1.3dbc6ap-1, /* 0.620578, 207 */
+0x1.413478p-1, /* 0.627353, 208 */
+0x1.44b228p-1, /* 0.634172, 209 */
+0x1.48357cp-1, /* 0.641033, 210 */
+0x1.4bbe76p-1, /* 0.647937, 211 */
+0x1.4f4d18p-1, /* 0.654885, 212 */
+0x1.52e168p-1, /* 0.661876, 213 */
+0x1.567b64p-1, /* 0.668910, 214 */
+0x1.5a1b1p-1, /* 0.675988, 215 */
+0x1.5dc07p-1, /* 0.683109, 216 */
+0x1.616b86p-1, /* 0.690273, 217 */
+0x1.651c54p-1, /* 0.697482, 218 */
+0x1.68d2dcp-1, /* 0.704734, 219 */
+0x1.6c8f22p-1, /* 0.712030, 220 */
+0x1.705126p-1, /* 0.719369, 221 */
+0x1.7418eep-1, /* 0.726753, 222 */
+0x1.77e67ap-1, /* 0.734180, 223 */
+0x1.7bb9cep-1, /* 0.741652, 224 */
+0x1.7f92eap-1, /* 0.749168, 225 */
+0x1.8371d6p-1, /* 0.756728, 226 */
+0x1.87568ep-1, /* 0.764332, 227 */
+0x1.8b411ap-1, /* 0.771981, 228 */
+0x1.8f317ap-1, /* 0.779674, 229 */
+0x1.9327bp-1, /* 0.787412, 230 */
+0x1.9723cp-1, /* 0.795195, 231 */
+0x1.9b25aap-1, /* 0.803022, 232 */
+0x1.9f2d74p-1, /* 0.810894, 233 */
+0x1.a33b1ep-1, /* 0.818810, 234 */
+0x1.a74eacp-1, /* 0.826772, 235 */
+0x1.ab682p-1, /* 0.834779, 236 */
+0x1.af877cp-1, /* 0.842831, 237 */
+0x1.b3accp-1, /* 0.850927, 238 */
+0x1.b7d7f2p-1, /* 0.859069, 239 */
+0x1.bc0914p-1, /* 0.867257, 240 */
+0x1.c04026p-1, /* 0.875489, 241 */
+0x1.c47d2ap-1, /* 0.883767, 242 */
+0x1.c8c024p-1, /* 0.892091, 243 */
+0x1.cd0918p-1, /* 0.900460, 244 */
+0x1.d15804p-1, /* 0.908875, 245 */
+0x1.d5acecp-1, /* 0.917335, 246 */
+0x1.da07d4p-1, /* 0.925841, 247 */
+0x1.de68bcp-1, /* 0.934393, 248 */
+0x1.e2cfa8p-1, /* 0.942991, 249 */
+0x1.e73c9ap-1, /* 0.951634, 250 */
+0x1.ebaf96p-1, /* 0.960324, 251 */
+0x1.f0289ep-1, /* 0.969060, 252 */
+0x1.f4a7b6p-1, /* 0.977842, 253 */
+0x1.f92cep-1, /* 0.986670, 254 */
+0x1.fdb822p-1, /* 0.995545, 255 */
+999.0
+};
diff --git a/extensions/two-table.c b/extensions/two-table.c
new file mode 100644 (file)
index 0000000..5c67ad6
--- /dev/null
@@ -0,0 +1,233 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2013, Daniel Sabo
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include "babl.h"
+
+#include "base/util.h"
+#include "extensions/two-table-tables.h"
+
+static inline unsigned char
+conv_float_u8_two_table_map (float value)
+{
+  unsigned short index;
+  unsigned char result;
+  if (value < 0.0f)
+    return 0;
+  else if (value > 1.0f)
+    return 0xFF;
+  index = (unsigned short)(value * 0xFFFF);
+  result = linear_to_gamma[index];
+
+  if (value < u8_gamma_minimums[result])
+    result -= 1;
+  else if (value >= u8_gamma_minimums[result+1])
+    result += 1;
+
+  return result;
+}
+
+static long
+conv_rgbafloat_linear_cairo24_le (unsigned char *src_char,
+                                  unsigned char *dst,
+                                  long           samples)
+{
+  long   n    = samples;
+  float *src  = (float*)src_char;
+
+  while (n--)
+    {
+      if (src[3] < BABL_ALPHA_THRESHOLD)
+        {
+          *(int *)dst = 0;
+        }
+      else
+        {
+          dst[0] = conv_float_u8_two_table_map (src[2]);
+          dst[1] = conv_float_u8_two_table_map (src[1]);
+          dst[2] = conv_float_u8_two_table_map (src[0]);
+        }
+      src += 4;
+      dst += 4;
+    }
+  return samples;
+}
+
+static long
+conv_rgbfloat_linear_cairo24_le (unsigned char *src_char,
+                                 unsigned char *dst,
+                                 long           samples)
+{
+  long   n   = samples;
+  float *src = (float*)src_char;
+
+  while (n--)
+    {
+      dst[0] = conv_float_u8_two_table_map (src[2]);
+      dst[1] = conv_float_u8_two_table_map (src[1]);
+      dst[2] = conv_float_u8_two_table_map (src[0]);
+
+      src += 3;
+      dst += 4;
+    }
+  return samples;
+}
+
+static long
+conv_rgbafloat_linear_rgbu8_gamma (unsigned char *src_char,
+                                   unsigned char *dst,
+                                   long           samples)
+{
+  long   n    = samples;
+  float *src  = (float*)src_char;
+
+  while (n--)
+    {
+      if (src[3] < BABL_ALPHA_THRESHOLD)
+        {
+          dst[0] = 0;
+          dst[1] = 0;
+          dst[2] = 0;
+        }
+      else
+        {
+          dst[0] = conv_float_u8_two_table_map (src[0]);
+          dst[1] = conv_float_u8_two_table_map (src[1]);
+          dst[2] = conv_float_u8_two_table_map (src[2]);
+        }
+      src += 4;
+      dst += 3;
+    }
+  return samples;
+}
+
+static long
+conv_rgbfloat_linear_rgbu8_gamma (unsigned char *src_char,
+                                  unsigned char *dst,
+                                  long           samples)
+{
+  long   n   = samples;
+  float *src = (float*)src_char;
+
+  while (n--)
+    {
+      dst[0] = conv_float_u8_two_table_map (src[0]);
+      dst[1] = conv_float_u8_two_table_map (src[1]);
+      dst[2] = conv_float_u8_two_table_map (src[2]);
+
+      src += 3;
+      dst += 3;
+    }
+  return samples;
+}
+
+static long
+conv_yfloat_linear_yu8_gamma (unsigned char *src_char,
+                              unsigned char *dst,
+                              long           samples)
+{
+  long   n   = samples;
+  float *src = (float*)src_char;
+
+  while (n--)
+    {
+      *dst++ = conv_float_u8_two_table_map (*src++);
+    }
+  return samples;
+}
+
+static long
+conv_yafloat_linear_yau8_gamma (unsigned char *src_char,
+                                unsigned char *dst,
+                                long           samples)
+{
+  long   n   = samples;
+  float *src = (float*)src_char;
+
+  while (n--)
+    {
+      long int alpha;
+      *dst++ = conv_float_u8_two_table_map (*src++);
+
+      alpha  = rint (*src++ * 255.0);
+      *dst++ = (alpha < 0) ? 0 : ((alpha > 255) ? 255 : alpha);
+    }
+  return samples;
+}
+
+int init (void);
+
+int
+init (void)
+{
+  int   testint  = 23;
+  char *testchar = (char*) &testint;
+  int   littleendian = (testchar[0] == 23);
+
+  if (littleendian)
+    {
+      const Babl *f24 = babl_format_new (
+        "name", "cairo-RGB24",
+        babl_model ("R'G'B'"),
+        babl_type ("u8"),
+        babl_component ("B'"),
+        babl_component ("G'"),
+        babl_component ("R'"),
+        babl_component ("PAD"),
+        NULL
+      );
+
+      babl_conversion_new (babl_format ("RGB float"),
+                           f24,
+                           "linear",
+                           conv_rgbfloat_linear_cairo24_le,
+                           NULL);
+
+      babl_conversion_new (babl_format ("RGBA float"),
+                           f24,
+                           "linear",
+                           conv_rgbafloat_linear_cairo24_le,
+                           NULL);
+    }
+
+  babl_conversion_new (babl_format ("RGBA float"),
+                       babl_format ("R'G'B' u8"),
+                       "linear",
+                       conv_rgbafloat_linear_rgbu8_gamma,
+                       NULL);
+
+  babl_conversion_new (babl_format ("RGB float"),
+                       babl_format ("R'G'B' u8"),
+                       "linear",
+                       conv_rgbfloat_linear_rgbu8_gamma,
+                       NULL);
+
+  babl_conversion_new (babl_format ("Y float"),
+                       babl_format ("Y' u8"),
+                       "linear",
+                       conv_yfloat_linear_yu8_gamma,
+                       NULL);
+
+  babl_conversion_new (babl_format ("YA float"),
+                       babl_format ("Y'A u8"),
+                       "linear",
+                       conv_yafloat_linear_yau8_gamma,
+                       NULL);
+
+  return 0;
+}
diff --git a/extensions/ycbcr.c b/extensions/ycbcr.c
new file mode 100644 (file)
index 0000000..11db563
--- /dev/null
@@ -0,0 +1,258 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <math.h>
+#include <string.h>
+
+#include "babl.h"
+#include "base/util.h"
+
+
+static void components  (void);
+static void models      (void);
+static void conversions (void);
+static void formats     (void);
+
+int init (void);
+
+
+int
+init (void)
+{
+  components ();
+  models ();
+  conversions ();
+  formats ();
+
+  return 0;
+}
+
+
+static void
+components (void)
+{
+  babl_component_new ("alpha", NULL);
+}
+
+
+static void
+models (void)
+{
+  babl_model_new (
+    "name", "Y'CbCr709",
+    babl_component ("Y'"),
+    babl_component ("Cb"),
+    babl_component ("Cr"),
+    NULL);
+
+  babl_model_new (
+    "name", "Y'CbCrA709",
+    babl_component ("Y'"),
+    babl_component ("Cb"),
+    babl_component ("Cr"),
+    babl_component ("alpha"),
+    NULL);
+}
+
+
+static long
+rgba_to_ycbcra709 (char *src,
+                   char *dst,
+                   long  n)
+{
+  while (n--)
+    {
+      double red   = ((double *) src)[0];
+      double green = ((double *) src)[1];
+      double blue  = ((double *) src)[2];
+      double alpha = ((double *) src)[3];
+
+      double luminance, cb, cr;
+
+      red   = linear_to_gamma_2_2 (red);
+      green = linear_to_gamma_2_2 (green);
+      blue  = linear_to_gamma_2_2 (blue);
+
+      luminance =  0.2126 * red + 0.7152 * green + 0.0722 * blue;
+      cb        =  (blue - luminance) / 1.8556;
+      cr        =  (red  - luminance) / 1.5748;
+
+      ((double *) dst)[0] = luminance;
+      ((double *) dst)[1] = cb;
+      ((double *) dst)[2] = cr;
+      ((double *) dst)[3] = alpha;
+
+      src += sizeof (double) * 4;
+      dst += sizeof (double) * 4;
+    }
+  return n;
+}
+
+
+static long
+rgba_to_ycbcr709 (char *src,
+                  char *dst,
+                  long  n)
+{
+  while (n--)
+    {
+      double red   = ((double *) src)[0];
+      double green = ((double *) src)[1];
+      double blue  = ((double *) src)[2];
+
+      double luminance, cb, cr;
+
+      red   = linear_to_gamma_2_2 (red);
+      green = linear_to_gamma_2_2 (green);
+      blue  = linear_to_gamma_2_2 (blue);
+
+      luminance =  0.2126 * red + 0.7152 * green + 0.0722 * blue;
+      cb        =  (blue - luminance) / 1.8556;
+      cr        =  (red  - luminance) / 1.5748;
+
+      ((double *) dst)[0] = luminance;
+      ((double *) dst)[1] = cb;
+      ((double *) dst)[2] = cr;
+
+      src += sizeof (double) * 4;
+      dst += sizeof (double) * 3;
+    }
+  return n;
+}
+
+
+static long
+ycbcra709_to_rgba (char *src,
+                char *dst,
+                long  n)
+{
+  while (n--)
+    {
+      double luminance = ((double *) src)[0];
+      double cb        = ((double *) src)[1];
+      double cr        = ((double *) src)[2];
+      double alpha     = ((double *) src)[3];
+
+      double red, green, blue;
+
+      red   = 1.0 * luminance + 0.0    * cb + 1.5748 * cr;
+      green = 1.0 * luminance - 0.1873 * cb - 0.4681 * cr;
+      blue  = 1.0 * luminance + 1.8556 * cb + 0.0    * cr;
+
+      red   = gamma_2_2_to_linear (red);
+      green = gamma_2_2_to_linear (green);
+      blue  = gamma_2_2_to_linear (blue);
+
+      ((double *) dst)[0] = red;
+      ((double *) dst)[1] = green;
+      ((double *) dst)[2] = blue;
+      ((double *) dst)[3] = alpha;
+
+      src += sizeof (double) * 4;
+      dst += sizeof (double) * 4;
+    }
+  return n;
+}
+
+
+static long
+ycbcr709_to_rgba (char *src,
+               char *dst,
+               long  n)
+{
+  while (n--)
+    {
+      double luminance = ((double *) src)[0];
+      double cb        = ((double *) src)[1];
+      double cr        = ((double *) src)[2];
+
+      double red, green, blue;
+
+      red   = 1.0 * luminance + 0.0    * cb + 1.5748 * cr;
+      green = 1.0 * luminance - 0.1873 * cb - 0.4681 * cr;
+      blue  = 1.0 * luminance + 1.8556 * cb + 0.0    * cr;
+
+      red   = gamma_2_2_to_linear (red);
+      green = gamma_2_2_to_linear (green);
+      blue  = gamma_2_2_to_linear (blue);
+
+      ((double *) dst)[0] = red;
+      ((double *) dst)[1] = green;
+      ((double *) dst)[2] = blue;
+      ((double *) dst)[3] = 1.0;
+
+      src += sizeof (double) * 3;
+      dst += sizeof (double) * 4;
+    }
+  return n;
+}
+
+
+static void
+conversions (void)
+{
+  babl_conversion_new (
+    babl_model ("RGBA"),
+    babl_model ("Y'CbCr709"),
+    "linear", rgba_to_ycbcr709,
+    NULL
+  );
+  babl_conversion_new (
+    babl_model ("RGBA"),
+    babl_model ("Y'CbCrA709"),
+    "linear", rgba_to_ycbcra709,
+    NULL
+  );
+  babl_conversion_new (
+    babl_model ("Y'CbCrA709"),
+    babl_model ("RGBA"),
+    "linear", ycbcra709_to_rgba,
+    NULL
+  );
+  babl_conversion_new (
+    babl_model ("Y'CbCr709"),
+    babl_model ("RGBA"),
+    "linear", ycbcr709_to_rgba,
+    NULL
+  );
+}
+
+
+static void
+formats (void)
+{
+  babl_format_new (
+    babl_model ("Y'CbCrA709"),
+    babl_type ("float"),
+    babl_component ("Y'"),
+    babl_type ("float"),
+    babl_component ("Cb"),
+    babl_component ("Cr"),
+    babl_component ("alpha"),
+    NULL);
+
+  babl_format_new (
+    babl_model ("Y'CbCr709"),
+    babl_type ("float"),
+    babl_component ("Y'"),
+    babl_type ("float"),
+    babl_component ("Cb"),
+    babl_component ("Cr"),
+    NULL);
+}
index c7d06c3c070692e824797ea6ce1078b7a9928f5a..33f642a0f022515f0d5aa8fb72e3c6b8cd752135 100644 (file)
--- a/ltmain.sh
+++ b/ltmain.sh
@@ -70,7 +70,7 @@
 #         compiler:            $LTCC
 #         compiler flags:              $LTCFLAGS
 #         linker:              $LD (gnu? $with_gnu_ld)
-#         $progname:   (GNU libtool) 2.4.2 Debian-2.4.2-1
+#         $progname:   (GNU libtool) 2.4.2 Debian-2.4.2-1.1
 #         automake:    $automake_version
 #         autoconf:    $autoconf_version
 #
@@ -80,7 +80,7 @@
 
 PROGRAM=libtool
 PACKAGE=libtool
-VERSION="2.4.2 Debian-2.4.2-1"
+VERSION="2.4.2 Debian-2.4.2-1.1"
 TIMESTAMP=""
 package_revision=1.3337
 
diff --git a/m4/introspection.m4 b/m4/introspection.m4
deleted file mode 100644 (file)
index 84e2c61..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-dnl -*- mode: autoconf -*-
-dnl Copyright 2009 Johan Dahlin
-dnl
-dnl This file is free software; the author(s) gives unlimited
-dnl permission to copy and/or distribute it, with or without
-dnl modifications, as long as this notice is preserved.
-dnl
-
-# serial 1
-
-m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL],
-[
-    AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first
-    AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first
-    AC_BEFORE([LT_INIT],[$0])dnl setup libtool first
-
-    dnl enable/disable introspection
-    m4_if([$2], [require],
-    [dnl
-        enable_introspection=yes
-    ],[dnl
-        AC_ARG_ENABLE(introspection,
-                  AS_HELP_STRING([--enable-introspection[=@<:@no/auto/yes@:>@]],
-                                 [Enable introspection for this build]),, 
-                                 [enable_introspection=no])
-    ])dnl
-
-    AC_MSG_CHECKING([for gobject-introspection])
-
-    dnl presence/version checking
-    AS_CASE([$enable_introspection],
-    [no], [dnl
-        found_introspection="no (disabled, use --enable-introspection to enable)"
-    ],dnl
-    [yes],[dnl
-        PKG_CHECK_EXISTS([gobject-introspection-1.0],,
-                         AC_MSG_ERROR([gobject-introspection-1.0 is not installed]))
-        PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1],
-                         found_introspection=yes,
-                         AC_MSG_ERROR([You need to have gobject-introspection >= $1 installed to build AC_PACKAGE_NAME]))
-    ],dnl
-    [auto],[dnl
-        PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, found_introspection=no)
-    ],dnl
-    [dnl       
-        AC_MSG_ERROR([invalid argument passed to --enable-introspection, should be one of @<:@no/auto/yes@:>@])
-    ])dnl
-
-    AC_MSG_RESULT([$found_introspection])
-
-    INTROSPECTION_SCANNER=
-    INTROSPECTION_COMPILER=
-    INTROSPECTION_GENERATE=
-    INTROSPECTION_GIRDIR=
-    INTROSPECTION_TYPELIBDIR=
-    if test "x$found_introspection" = "xyes"; then
-       INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
-       INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
-       INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
-       INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
-       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
-       INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
-       INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
-       INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
-    fi
-    AC_SUBST(INTROSPECTION_SCANNER)
-    AC_SUBST(INTROSPECTION_COMPILER)
-    AC_SUBST(INTROSPECTION_GENERATE)
-    AC_SUBST(INTROSPECTION_GIRDIR)
-    AC_SUBST(INTROSPECTION_TYPELIBDIR)
-    AC_SUBST(INTROSPECTION_CFLAGS)
-    AC_SUBST(INTROSPECTION_LIBS)
-    AC_SUBST(INTROSPECTION_MAKEFILE)
-
-    AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$found_introspection" = "xyes")
-])
-
-
-dnl Usage:
-dnl   GOBJECT_INTROSPECTION_CHECK([minimum-g-i-version])
-
-AC_DEFUN([GOBJECT_INTROSPECTION_CHECK],
-[
-  _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1])
-])
-
-dnl Usage:
-dnl   GOBJECT_INTROSPECTION_REQUIRE([minimum-g-i-version])
-
-
-AC_DEFUN([GOBJECT_INTROSPECTION_REQUIRE],
-[
-  _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1], [require])
-])
index 828104cfde21845bcd4632d75a4f63ce9fca60fb..534d1ccd4194da9fb10c68334042b3cb23afcdb7 100644 (file)
@@ -2512,17 +2512,6 @@ freebsd* | dragonfly*)
   esac
   ;;
 
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
 haiku*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
@@ -2639,7 +2628,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
@@ -3255,10 +3244,6 @@ freebsd* | dragonfly*)
   fi
   ;;
 
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
 haiku*)
   lt_cv_deplibs_check_method=pass_all
   ;;
@@ -3297,7 +3282,7 @@ irix5* | irix6* | nonstopux*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
@@ -4049,7 +4034,7 @@ m4_if([$1], [CXX], [
            ;;
        esac
        ;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
        case $cc_basename in
          KCC*)
            # KAI C++ Compiler
@@ -4348,7 +4333,7 @@ m4_if([$1], [CXX], [
       _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -6241,9 +6226,6 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(ld_shlibs, $1)=yes
         ;;
 
-      gnu*)
-        ;;
-
       haiku*)
         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
         _LT_TAGVAR(link_all_deplibs, $1)=yes
@@ -6405,7 +6387,7 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(inherit_rpath, $1)=yes
         ;;
 
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
         case $cc_basename in
           KCC*)
            # Kuck and Associates, Inc. (KAI) C++ Compiler
index ba88a9c58c7ecde3784b83a8224ed687ec0f9782..2733a28c4a33d308ae400ea4a7fbf8968b7cb069 100644 (file)
@@ -2,22 +2,32 @@ if OS_UNIX
 CONCURRENCY_STRESS_TEST = concurrency-stress-test 
 endif
 
-TESTS =                                \
+C_TESTS =                              \
        grayscale_to_rgb        \
        rgb_to_bgr              \
        rgb_to_ycbcr            \
        srgb_to_lab_u8          \
        sanity                  \
        babl_class_name         \
+       extract \
+       floatclamp \
+       float-to-8bit \
+       hsl    \
+       hsva   \
        types                   \
        palette \
        extract \
        nop \
        n_components            \
+       n_components_cast \
        models                  \
+       cairo-RGB24             \
        $(CONCURRENCY_STRESS_TEST)
 
-TESTS_ENVIRONMENT = BABL_PATH=$(top_builddir)/extensions/.libs
+TESTS = \
+       $(C_TESTS)
+
+TESTS_ENVIRONMENT = LD_LIBRARY_PATH=$(top_builddir)/babl:$LD_LIBRARY_PATH GI_TYPELIB_PATH=$(top_builddir)/babl BABL_PATH=$(top_builddir)/extensions/.libs
 
 AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/babl
 if OS_UNIX
@@ -27,6 +37,8 @@ endif
 LDADD = $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \
        $(MATH_LIB)
 
+EXTRA_DIST=common.inc
+
 noinst_PROGRAMS =              \
        introspect              \
        babl_fish_path_fitness  \
@@ -34,4 +46,4 @@ noinst_PROGRAMS =             \
        babl-html-dump          \
        conversions             \
        formats                 \
-       $(TESTS)
+       $(C_TESTS)
index 25ec512811a6aa0e4c9410042c9b37408ed13ec5..75690d08298d2e1586f2ecc769114dd6c896c2ce 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 @SET_MAKE@
 
 VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -34,22 +51,18 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-TESTS = grayscale_to_rgb$(EXEEXT) rgb_to_bgr$(EXEEXT) \
-       rgb_to_ycbcr$(EXEEXT) srgb_to_lab_u8$(EXEEXT) sanity$(EXEEXT) \
-       babl_class_name$(EXEEXT) types$(EXEEXT) palette$(EXEEXT) \
-       extract$(EXEEXT) nop$(EXEEXT) n_components$(EXEEXT) \
-       models$(EXEEXT) $(am__EXEEXT_1)
+target_triplet = @target@
+TESTS = $(am__EXEEXT_2)
 noinst_PROGRAMS = introspect$(EXEEXT) babl_fish_path_fitness$(EXEEXT) \
        babl_fish_path_dhtml$(EXEEXT) babl-html-dump$(EXEEXT) \
        conversions$(EXEEXT) formats$(EXEEXT) $(am__EXEEXT_2)
 subdir = tests
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/introspection.m4 \
-       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
-       $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -59,9 +72,11 @@ CONFIG_CLEAN_VPATH_FILES =
 @OS_UNIX_TRUE@am__EXEEXT_1 = concurrency-stress-test$(EXEEXT)
 am__EXEEXT_2 = grayscale_to_rgb$(EXEEXT) rgb_to_bgr$(EXEEXT) \
        rgb_to_ycbcr$(EXEEXT) srgb_to_lab_u8$(EXEEXT) sanity$(EXEEXT) \
-       babl_class_name$(EXEEXT) types$(EXEEXT) palette$(EXEEXT) \
-       extract$(EXEEXT) nop$(EXEEXT) n_components$(EXEEXT) \
-       models$(EXEEXT) $(am__EXEEXT_1)
+       babl_class_name$(EXEEXT) extract$(EXEEXT) floatclamp$(EXEEXT) \
+       float-to-8bit$(EXEEXT) hsl$(EXEEXT) hsva$(EXEEXT) \
+       types$(EXEEXT) palette$(EXEEXT) extract$(EXEEXT) nop$(EXEEXT) \
+       n_components$(EXEEXT) n_components_cast$(EXEEXT) \
+       models$(EXEEXT) cairo-RGB24$(EXEEXT) $(am__EXEEXT_1)
 PROGRAMS = $(noinst_PROGRAMS)
 babl_html_dump_SOURCES = babl-html-dump.c
 babl_html_dump_OBJECTS = babl-html-dump.$(OBJEXT)
@@ -91,6 +106,12 @@ babl_fish_path_fitness_LDADD = $(LDADD)
 babl_fish_path_fitness_DEPENDENCIES =  \
        $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \
        $(am__DEPENDENCIES_1)
+cairo_RGB24_SOURCES = cairo-RGB24.c
+cairo_RGB24_OBJECTS = cairo-RGB24.$(OBJEXT)
+cairo_RGB24_LDADD = $(LDADD)
+cairo_RGB24_DEPENDENCIES =  \
+       $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \
+       $(am__DEPENDENCIES_1)
 concurrency_stress_test_SOURCES = concurrency-stress-test.c
 concurrency_stress_test_OBJECTS = concurrency-stress-test.$(OBJEXT)
 concurrency_stress_test_LDADD = $(LDADD)
@@ -109,6 +130,18 @@ extract_LDADD = $(LDADD)
 extract_DEPENDENCIES =  \
        $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \
        $(am__DEPENDENCIES_1)
+float_to_8bit_SOURCES = float-to-8bit.c
+float_to_8bit_OBJECTS = float-to-8bit.$(OBJEXT)
+float_to_8bit_LDADD = $(LDADD)
+float_to_8bit_DEPENDENCIES =  \
+       $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \
+       $(am__DEPENDENCIES_1)
+floatclamp_SOURCES = floatclamp.c
+floatclamp_OBJECTS = floatclamp.$(OBJEXT)
+floatclamp_LDADD = $(LDADD)
+floatclamp_DEPENDENCIES =  \
+       $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \
+       $(am__DEPENDENCIES_1)
 formats_SOURCES = formats.c
 formats_OBJECTS = formats.$(OBJEXT)
 formats_LDADD = $(LDADD)
@@ -121,6 +154,17 @@ grayscale_to_rgb_LDADD = $(LDADD)
 grayscale_to_rgb_DEPENDENCIES =  \
        $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \
        $(am__DEPENDENCIES_1)
+hsl_SOURCES = hsl.c
+hsl_OBJECTS = hsl.$(OBJEXT)
+hsl_LDADD = $(LDADD)
+hsl_DEPENDENCIES = $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \
+       $(am__DEPENDENCIES_1)
+hsva_SOURCES = hsva.c
+hsva_OBJECTS = hsva.$(OBJEXT)
+hsva_LDADD = $(LDADD)
+hsva_DEPENDENCIES =  \
+       $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \
+       $(am__DEPENDENCIES_1)
 introspect_SOURCES = introspect.c
 introspect_OBJECTS = introspect.$(OBJEXT)
 introspect_LDADD = $(LDADD)
@@ -139,6 +183,12 @@ n_components_LDADD = $(LDADD)
 n_components_DEPENDENCIES =  \
        $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \
        $(am__DEPENDENCIES_1)
+n_components_cast_SOURCES = n_components_cast.c
+n_components_cast_OBJECTS = n_components_cast.$(OBJEXT)
+n_components_cast_LDADD = $(LDADD)
+n_components_cast_DEPENDENCIES =  \
+       $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \
+       $(am__DEPENDENCIES_1)
 nop_SOURCES = nop.c
 nop_OBJECTS = nop.$(OBJEXT)
 nop_LDADD = $(LDADD)
@@ -207,16 +257,24 @@ AM_V_GEN = $(am__v_GEN_@AM_V@)
 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
 am__v_GEN_0 = @echo "  GEN   " $@;
 SOURCES = babl-html-dump.c babl_class_name.c babl_fish_path_dhtml.c \
-       babl_fish_path_fitness.c concurrency-stress-test.c \
-       conversions.c extract.c formats.c grayscale_to_rgb.c \
-       introspect.c models.c n_components.c nop.c palette.c \
-       rgb_to_bgr.c rgb_to_ycbcr.c sanity.c srgb_to_lab_u8.c types.c
+       babl_fish_path_fitness.c cairo-RGB24.c \
+       concurrency-stress-test.c conversions.c extract.c \
+       float-to-8bit.c floatclamp.c formats.c grayscale_to_rgb.c \
+       hsl.c hsva.c introspect.c models.c n_components.c \
+       n_components_cast.c nop.c palette.c rgb_to_bgr.c \
+       rgb_to_ycbcr.c sanity.c srgb_to_lab_u8.c types.c
 DIST_SOURCES = babl-html-dump.c babl_class_name.c \
-       babl_fish_path_dhtml.c babl_fish_path_fitness.c \
-       concurrency-stress-test.c conversions.c extract.c formats.c \
-       grayscale_to_rgb.c introspect.c models.c n_components.c nop.c \
-       palette.c rgb_to_bgr.c rgb_to_ycbcr.c sanity.c \
-       srgb_to_lab_u8.c types.c
+       babl_fish_path_dhtml.c babl_fish_path_fitness.c cairo-RGB24.c \
+       concurrency-stress-test.c conversions.c extract.c \
+       float-to-8bit.c floatclamp.c formats.c grayscale_to_rgb.c \
+       hsl.c hsva.c introspect.c models.c n_components.c \
+       n_components_cast.c nop.c palette.c rgb_to_bgr.c \
+       rgb_to_ycbcr.c sanity.c srgb_to_lab_u8.c types.c
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 ETAGS = etags
 CTAGS = ctags
 am__tty_colors = \
@@ -268,14 +326,6 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
-INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
-INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
-INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
-INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
-INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
-INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
-INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -305,18 +355,15 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEP = @PATH_SEP@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
 RANLIB = @RANLIB@
 RSVG = @RSVG@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SHREXT = @SHREXT@
+SSE2_EXTRA_CFLAGS = @SSE2_EXTRA_CFLAGS@
 SSE_EXTRA_CFLAGS = @SSE_EXTRA_CFLAGS@
 STRIP = @STRIP@
-VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 W3M = @W3M@
 WEBSITE_HOST = @WEBSITE_HOST@
@@ -369,17 +416,44 @@ sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sysconfdir = @sysconfdir@
+target = @target@
 target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 @OS_UNIX_TRUE@CONCURRENCY_STRESS_TEST = concurrency-stress-test 
-TESTS_ENVIRONMENT = BABL_PATH=$(top_builddir)/extensions/.libs
+C_TESTS = \
+       grayscale_to_rgb        \
+       rgb_to_bgr              \
+       rgb_to_ycbcr            \
+       srgb_to_lab_u8          \
+       sanity                  \
+       babl_class_name         \
+       extract \
+       floatclamp \
+       float-to-8bit \
+       hsl    \
+       hsva   \
+       types                   \
+       palette \
+       extract \
+       nop \
+       n_components            \
+       n_components_cast \
+       models                  \
+       cairo-RGB24             \
+       $(CONCURRENCY_STRESS_TEST)
+
+TESTS_ENVIRONMENT = LD_LIBRARY_PATH=$(top_builddir)/babl:$LD_LIBRARY_PATH GI_TYPELIB_PATH=$(top_builddir)/babl BABL_PATH=$(top_builddir)/extensions/.libs
 AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/babl
 @OS_UNIX_TRUE@AM_LDFLAGS = -pthread
 LDADD = $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \
        $(MATH_LIB)
 
+EXTRA_DIST = common.inc
 all: all-am
 
 .SUFFIXES:
@@ -435,6 +509,9 @@ babl_fish_path_dhtml$(EXEEXT): $(babl_fish_path_dhtml_OBJECTS) $(babl_fish_path_
 babl_fish_path_fitness$(EXEEXT): $(babl_fish_path_fitness_OBJECTS) $(babl_fish_path_fitness_DEPENDENCIES) $(EXTRA_babl_fish_path_fitness_DEPENDENCIES) 
        @rm -f babl_fish_path_fitness$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(babl_fish_path_fitness_OBJECTS) $(babl_fish_path_fitness_LDADD) $(LIBS)
+cairo-RGB24$(EXEEXT): $(cairo_RGB24_OBJECTS) $(cairo_RGB24_DEPENDENCIES) $(EXTRA_cairo_RGB24_DEPENDENCIES) 
+       @rm -f cairo-RGB24$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(cairo_RGB24_OBJECTS) $(cairo_RGB24_LDADD) $(LIBS)
 concurrency-stress-test$(EXEEXT): $(concurrency_stress_test_OBJECTS) $(concurrency_stress_test_DEPENDENCIES) $(EXTRA_concurrency_stress_test_DEPENDENCIES) 
        @rm -f concurrency-stress-test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(concurrency_stress_test_OBJECTS) $(concurrency_stress_test_LDADD) $(LIBS)
@@ -444,12 +521,24 @@ conversions$(EXEEXT): $(conversions_OBJECTS) $(conversions_DEPENDENCIES) $(EXTRA
 extract$(EXEEXT): $(extract_OBJECTS) $(extract_DEPENDENCIES) $(EXTRA_extract_DEPENDENCIES) 
        @rm -f extract$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(extract_OBJECTS) $(extract_LDADD) $(LIBS)
+float-to-8bit$(EXEEXT): $(float_to_8bit_OBJECTS) $(float_to_8bit_DEPENDENCIES) $(EXTRA_float_to_8bit_DEPENDENCIES) 
+       @rm -f float-to-8bit$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(float_to_8bit_OBJECTS) $(float_to_8bit_LDADD) $(LIBS)
+floatclamp$(EXEEXT): $(floatclamp_OBJECTS) $(floatclamp_DEPENDENCIES) $(EXTRA_floatclamp_DEPENDENCIES) 
+       @rm -f floatclamp$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(floatclamp_OBJECTS) $(floatclamp_LDADD) $(LIBS)
 formats$(EXEEXT): $(formats_OBJECTS) $(formats_DEPENDENCIES) $(EXTRA_formats_DEPENDENCIES) 
        @rm -f formats$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(formats_OBJECTS) $(formats_LDADD) $(LIBS)
 grayscale_to_rgb$(EXEEXT): $(grayscale_to_rgb_OBJECTS) $(grayscale_to_rgb_DEPENDENCIES) $(EXTRA_grayscale_to_rgb_DEPENDENCIES) 
        @rm -f grayscale_to_rgb$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(grayscale_to_rgb_OBJECTS) $(grayscale_to_rgb_LDADD) $(LIBS)
+hsl$(EXEEXT): $(hsl_OBJECTS) $(hsl_DEPENDENCIES) $(EXTRA_hsl_DEPENDENCIES) 
+       @rm -f hsl$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(hsl_OBJECTS) $(hsl_LDADD) $(LIBS)
+hsva$(EXEEXT): $(hsva_OBJECTS) $(hsva_DEPENDENCIES) $(EXTRA_hsva_DEPENDENCIES) 
+       @rm -f hsva$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(hsva_OBJECTS) $(hsva_LDADD) $(LIBS)
 introspect$(EXEEXT): $(introspect_OBJECTS) $(introspect_DEPENDENCIES) $(EXTRA_introspect_DEPENDENCIES) 
        @rm -f introspect$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(introspect_OBJECTS) $(introspect_LDADD) $(LIBS)
@@ -459,6 +548,9 @@ models$(EXEEXT): $(models_OBJECTS) $(models_DEPENDENCIES) $(EXTRA_models_DEPENDE
 n_components$(EXEEXT): $(n_components_OBJECTS) $(n_components_DEPENDENCIES) $(EXTRA_n_components_DEPENDENCIES) 
        @rm -f n_components$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(n_components_OBJECTS) $(n_components_LDADD) $(LIBS)
+n_components_cast$(EXEEXT): $(n_components_cast_OBJECTS) $(n_components_cast_DEPENDENCIES) $(EXTRA_n_components_cast_DEPENDENCIES) 
+       @rm -f n_components_cast$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(n_components_cast_OBJECTS) $(n_components_cast_LDADD) $(LIBS)
 nop$(EXEEXT): $(nop_OBJECTS) $(nop_DEPENDENCIES) $(EXTRA_nop_DEPENDENCIES) 
        @rm -f nop$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(nop_OBJECTS) $(nop_LDADD) $(LIBS)
@@ -491,14 +583,20 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/babl_class_name.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/babl_fish_path_dhtml.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/babl_fish_path_fitness.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-RGB24.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/concurrency-stress-test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conversions.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extract.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/float-to-8bit.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/floatclamp.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/formats.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grayscale_to_rgb.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hsl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hsva.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/introspect.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/models.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n_components.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n_components_cast.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nop.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/palette.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rgb_to_bgr.Po@am__quote@
index 8480fc028bb324e492e0822a845a8c107c4e149e..bab17d699136315c7db2eb6bbba8dc15299bf969 100644 (file)
@@ -6,6 +6,11 @@
 #include <math.h>
 #include "babl-internal.h"
 
+#ifndef HAVE_SRANDOM
+#define srandom srand
+#define random  rand
+#endif
+
 #define pixels    1024
 int           total_length = 0;
 int           total_cost   = 0;
diff --git a/tests/cairo-RGB24.c b/tests/cairo-RGB24.c
new file mode 100644 (file)
index 0000000..a50eca1
--- /dev/null
@@ -0,0 +1,95 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "babl.h"
+
+static int
+cairo24_rgb_cairo24 (void)
+{
+  int OK = 1, i;
+
+  for (i = 0; i < 256; ++i)
+    {
+      /* Valgrind complains if 'tmp' is not initialized
+       * and the brittle RTTI (BABL_IS_BABL) produces a
+       * crash if it contains { 0x00, 0xb1, 0xba, 0x00 }
+       */
+      unsigned char tmp[4] = { 0, /*0xb1, 0xba, 0x00*/ };
+      /* Valgrind complains if 'output' is not initialized
+       * and the brittle RTTI (BABL_IS_BABL) produces a
+       * crash if it contains 0xbab100
+       */
+      unsigned int output = ~ 0xbab100;
+      unsigned int input = (i * 256 + i) * 256 + i;
+
+      babl_process (babl_fish ("cairo-RGB24", "R'G'B' u8"), &input, &tmp[0], 1);
+      babl_process (babl_fish ("R'G'B' u8", "cairo-RGB24"), &tmp[0], &output, 1);
+
+      if ((input & 0x00ffffff) != (output & 0x00ffffff))
+        {
+          fprintf (stderr , "%08x -> %d %d %d -> %08x\n",
+                   input, tmp[0], tmp[1], tmp[2], output);
+          OK = 0;
+        }
+    }
+
+  return OK;
+}
+
+static int
+rgb_cairo24_rgb (void)
+{
+  int OK = 1, i;
+
+  for (i = 0; i < 256; ++i)
+    {
+      /* As above */
+      unsigned int tmp = ~ 0xbab100;
+      unsigned char output[4] = { 0x00, /*0xb1, 0xba, 0x00*/ };
+      unsigned char input[4] = { i, i, i, 17 };
+
+      babl_process (babl_fish ("R'G'B' u8", "cairo-RGB24"), input, &tmp, 1);
+      babl_process (babl_fish ("cairo-RGB24", "R'G'B' u8"), &tmp, output, 1);
+
+      if (input[0] != output[0] || input[1] != output[1] || input[2] != output[2])
+        {
+          fprintf (stderr , "%d %d %d -> %08x -> %d %d %d\n",
+                   input[0], input[1], input[2], tmp, output[0], output[1], output[2]);
+          OK = 0;
+        }
+    }
+
+  return OK;
+}
+
+int
+main (void)
+{
+  int OK;
+
+  babl_init ();
+
+  OK = cairo24_rgb_cairo24 () && rgb_cairo24_rgb ();
+
+  babl_exit ();
+
+  return !OK;
+}
diff --git a/tests/common.inc b/tests/common.inc
new file mode 100644 (file)
index 0000000..501644a
--- /dev/null
@@ -0,0 +1,27 @@
+
+#include "babl/babl-introspect.h"
+
+#define CHECK_CONV(test_name, componenttype, src_fmt, dst_fmt, src_pix, expected_pix) \
+  {       \
+  const Babl *fish;       \
+  int i;       \
+  fish = babl_fish (src_fmt, dst_fmt);       \
+  if (!fish)       \
+    {       \
+      printf ("  %s failed to make fish\n", test_name);       \
+      OK = 0;       \
+    }       \
+  for (i = 0; i < sizeof(src_pix)/sizeof(src_pix[0]); i ++)       \
+    {       \
+      int c;\
+      componenttype result[10];       \
+      babl_process (fish, src_pix[i], result, 1);       \
+      for (c = 0; c < sizeof(expected_pix[i])/sizeof(expected_pix[i][0]); c++) \
+      if (result[c] != expected_pix[i][c])       \
+        {       \
+          printf (" %s failed #%i[%i]  got %i expected %i\n", test_name, i, c, result[c], expected_pix[i][c]);       \
+          OK = 0;          \
+          babl_introspect((Babl *)fish); \
+        }       \
+    }       \
+  }
index 6f6e92711b2b384b49f7ce584e1534474699a7ba..f27662bdbb15184d92d02e1f5fa77aea6bff291a 100644 (file)
 #include <stdio.h>
 #include <assert.h>
 #include "babl.h"
-
-
-#define CHECK_CONV(test_name, componenttype, src_fmt, dst_fmt, src_pix, expected_pix) \
-  {       \
-  const Babl *fish;       \
-  int i;       \
-  fish = babl_fish (src_fmt, dst_fmt);       \
-  if (!fish)       \
-    {       \
-      printf ("  %s failed to make fish\n", test_name);       \
-      OK = 0;       \
-    }       \
-  for (i = 0; i < sizeof(src_pix)/sizeof(src_pix[0]); i ++)       \
-    {       \
-      int c;\
-      componenttype result[10];       \
-      babl_process (fish, src_pix[i], result, 1);       \
-      for (c = 0; c < sizeof(expected_pix[i])/sizeof(expected_pix[i][0]); c++) \
-      if (result[c] != expected_pix[i][c])       \
-        {       \
-          printf (" %s failed #%i[%i]   %i\n", test_name, i, c, result[c]);       \
-          OK = 0;          \
-        }       \
-    }       \
-  }
+#include "common.inc"
 
 int
 main (int    argc,
@@ -53,92 +29,20 @@ main (int    argc,
 {
   int OK = 1;
   babl_init ();
-
   {
-    char in[][4]  = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
-    char out[][1] = {{      3},{      7},{       11}};
-
-    babl_format_new ("name", "A u8",
-         babl_model ("YA"), babl_type ("u8"),
-          babl_component ("A"), NULL);
-
-    CHECK_CONV("extract alpha", char,
-        babl_format("RGBA u8"), babl_format("A u8"),
+    unsigned char in[][4]   = {{0,1,2,3  },{4,5,6,7    },{8,9,10,11  }};
+    unsigned char out[][1]  = {    {2    },    {6}      ,    {10}     };
+
+    CHECK_CONV("extract B'", unsigned char,
+        babl_format("R'G'B'A u8"),
+        babl_format_new ("name", "B' u8",
+                          babl_model ("R'G'B'A"),
+                          babl_type ("u8"),
+                          babl_component ("B'"),
+                          NULL),
         in, out);
   }
 
-  {
-    char in[][4]  = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
-    char out[][1] = {{  1    },{  5    },{  9      }};
-
-    babl_format_new ("name", "G u8",
-         babl_model ("RGBA"), babl_type ("u8"),
-          babl_component ("G"), NULL);
-
-    CHECK_CONV("extract green", char,
-         babl_format("RGBA u8"), babl_format("G u8"),
-         in, out);
-  }
-
-
-  {
-    char in[][4]  = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
-    char out[][2] = {{  2,1  },{  6,5  },{  10,9   }};
-
-    babl_format_new ("name", "BG u8",
-         babl_model ("RGBA"), babl_type ("u8"),
-          babl_component ("B"),
-          babl_component ("G"), NULL);
-
-    CHECK_CONV("extract green", char,
-         babl_format("RGBA u8"), babl_format("BG u8"),
-         in, out);
-  }
-
-
-
-  {
-    float in[][4]  = {{0,1,2,3/255.0},{4,5,6,277/255.0},{8,9,10,101/255.0}};
-    char out[][1] = {{       3},      {      255},{             101}};
-
-    CHECK_CONV("extract alpha from float", char,
-         babl_format("RGBA float"), babl_format("A u8"),
-         in, out);
-  }
-
-  {
-    char in[][4]   = {{1,2,3,4},{4,5,6,7},{8,9,10,11}};
-    char out[][4]  = {{4,3,2,1},{7,6,5,4},{11,10,9,8}};
-
-    babl_format_new ("name", "abgr",
-         babl_model ("RGBA"), babl_type ("u8"),
-          babl_component ("A"),
-          babl_component ("B"),
-          babl_component ("G"),
-          babl_component ("R"),
-          NULL);
-
-    CHECK_CONV("bgra", char,
-         babl_format("RGBA u8"), babl_format("abgr"),
-         in, out);
-  }
-
-  {
-    char in[][4]   = {{1,2,3,4},{4,5,6,7},{8,9,10,11}};
-    //char out[][4]= {{3,0,0,4},{6,0,0,7},{10,0,0,11}};
-    char out[][4]  = {{3,3,3,4},{6,6,6,7},{10,10,10,11}};
-
-    CHECK_CONV("bPADa", char,
-         babl_format("RGBA u8"),
-         babl_format_new (babl_model ("RGBA"), babl_type ("u8"),
-               babl_component ("B"),
-               babl_component ("PAD"),
-               babl_component ("PAD"),
-               babl_component ("A"),
-               NULL),
-         in, out);
-  }
-
   babl_exit ();
   return !OK;
 }
diff --git a/tests/float-to-8bit.c b/tests/float-to-8bit.c
new file mode 100644 (file)
index 0000000..a93591c
--- /dev/null
@@ -0,0 +1,102 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include "babl.h"
+
+#include "common.inc"
+
+
+int
+main (int    argc,
+      char **argv)
+{
+  int OK = 1;
+
+  babl_init ();
+  
+  //for (i = 0; i < 400000; i++)
+  {
+  {
+    float in[][4]   = {{ 0.21582, -0.55, -0.14, 1.0 }, {0.2, 0.3, 0.5, 0.6}, {0.0, 1.0, 2.0, 3.0}};
+    unsigned char out[][4]  = {{ 55, 0, 0, 255 }, {51,77,128,153}, {0,255,255,255}};
+
+    CHECK_CONV("float -> u8 1", unsigned char,
+        babl_format("R'G'B'A float"),
+        babl_format("R'G'B'A u8"),
+        in, out);
+  }
+
+  {
+    float in[][4]   = {{ 0.21582, -0.55, -0.14, 1.0 }, {0.2, 0.3, 0.5, 0.6}, {0.0, 1.0, 2.0, 3.0}};
+    unsigned char out[][4]  = {{ 10, 0, 0, 255 }, {8,19,55,153}, {0,255,255,255}};
+
+    CHECK_CONV("float -> u8 2", unsigned char,
+        babl_format("R'G'B'A float"),
+        babl_format("RGBA u8"),
+        in, out);
+  }
+
+  {
+    float in[][4]   = {{ 0.21582, -0.55, -0.14, 1.0 }, {0.2, 0.3, 0.5, 0.6}, {0.0, 1.0, 2.0, 3.0}};
+    unsigned char out[][4]  = {{ 55, 0, 0, 255 }, {51,77,128,153}, {0,255,255,255}};
+
+    CHECK_CONV("float -> u8 3", unsigned char,
+        babl_format("RGBA float"),
+        babl_format("RGBA u8"),
+        in, out);
+  }
+
+  {
+    float in[][4]   = {{ 0.21582, -0.55, -0.14, 1.0 }, {0.2, 0.3, 0.5, 0.6}, {0.0, 1.0, 2.0, 3.0}};
+    unsigned char out[][3]  = {{128, 0, 0}, {124,149,188}, {0,255,255}};
+
+    CHECK_CONV("float -> u8 4", unsigned char,
+        babl_format("RGBA float"),
+        babl_format("R'G'B' u8"),
+        in, out);
+  }
+
+  {
+    float in[][4]   = {{ 0.21582, -0.55, -0.14, 1.0 }, {0.2, 0.3, 0.5, 0.6}, {0.0, 1.0, 2.0, 3.0}};
+    unsigned char out[][4]  = {{128, 0, 0, 255 }, {156,188,235,153}, {0,156,213,255}};
+
+    CHECK_CONV("float -> u8 5", unsigned char,
+        babl_format("RaGaBaA float"),
+        babl_format("R'G'B'A u8"),
+        in, out);
+  }
+
+  {
+    /*                                                 (0.5 / 0.6) * 255 = 212.5, I'm not going to worry about rounding that close... */
+    float in[][4]   = {{ 0.21582, -0.55, -0.14, 1.0 }, {0.2, 0.301, 0.49998, 0.6}, {0.0, 3.0, 6.0, 3.0}};
+    unsigned char out[][4]  = {{55, 0, 0, 255 }, {85,128,212,153}, {0,255,255,255}};
+
+    CHECK_CONV("float -> u8 6", unsigned char,
+        babl_format("R'aG'aB'aA float"),
+        babl_format("R'G'B'A u8"),
+        in, out);
+  }
+  }
+
+  babl_exit ();
+  return !OK;
+}
diff --git a/tests/floatclamp.c b/tests/floatclamp.c
new file mode 100644 (file)
index 0000000..4ba7992
--- /dev/null
@@ -0,0 +1,46 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include "babl.h"
+
+#include "common.inc"
+
+
+int
+main (int    argc,
+      char **argv)
+{
+  int OK = 1;
+  babl_init ();
+  {
+    float in[][4]   = {{ 0.21582, -0.55, -0.14, 1.0 }, {0.0, 1.0, 2.0, 3.0}};
+    unsigned char out[][4]  = {{ 55, 0, 0, 255 }, {0,255,255,255}};
+
+    CHECK_CONV("float -> u8", unsigned char,
+        babl_format("R'G'B'A float"),
+        babl_format("R'G'B'A u8"),
+        in, out);
+  }
+
+  babl_exit ();
+  return !OK;
+}
index 6658f7fcce4aae347144f2fa00aa3526b7f7786b..7da0c86fa70725711ed8867872318ae43bef5cdb 100644 (file)
@@ -61,7 +61,8 @@ test (void)
     {
       if (rgb_buf[i] != rgb_buf_ref[i])
         {
-          babl_log ("index %i is problematic", i);
+          babl_log ("index %i is problematic : %f instead of %f",
+                    i, rgb_buf[i], rgb_buf_ref[i]);
           OK = 0;
         }
     }
diff --git a/tests/hsl.c b/tests/hsl.c
new file mode 100644 (file)
index 0000000..4b24db2
--- /dev/null
@@ -0,0 +1,111 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <math.h>
+#include <stdio.h>
+
+#include "config.h"
+#include "babl.h"
+
+#define CHECK_CONV(test_name, componenttype, src_fmt, dst_fmt, src_pix, expected_pix) \
+  {                                                                     \
+    const Babl *fish;                                                   \
+    int i;                                                              \
+    fish = babl_fish (src_fmt, dst_fmt);                                \
+    if (!fish)                                                          \
+      {                                                                 \
+        printf ("  %s failed to make fish\n", test_name);               \
+        OK = 0;                                                         \
+      }                                                                 \
+    for (i = 0; i < sizeof(src_pix)/sizeof(src_pix[0]); i ++)           \
+      {                                                                 \
+        int c;                                                          \
+        componenttype result[10];                                       \
+        babl_process (fish, src_pix[i], result, 1);                     \
+        for (c = 0; c < sizeof(expected_pix[i])/sizeof(expected_pix[i][0]); c++) \
+          if (fabs(result[c] - expected_pix[i][c]) > 0.001)             \
+            {                                                           \
+              printf (" %s failed #%i[%i]  got %lf expected %lf\n",     \
+                      test_name, i, c, result[c], expected_pix[i][c]);  \
+              OK = 0;                                                   \
+            }                                                           \
+      }                                                                 \
+  }
+
+
+int
+main (int    argc,
+      char **argv)
+{
+  int OK = 1;
+
+  float rgba[][4] = {{1.0     , 1.0     , 1.0     , 1.0},
+                     {0.214041, 0.214041, 0.214041, 1.0},
+                     {0.0     , 0.0     , 0.0     , 1.0},
+                     {1.0     , 0.0     , 0.0     , 1.0},
+                     {0.522519, 0.522519, 0.0     , 1.0},
+                     {0.0     , 0.214041, 0.0     , 1.0},
+                     {0.214041, 1.0     , 1.0     , 1.0},
+                     {0.214041, 0.214041, 1.0     , 1.0},
+                     {0.522520, 0.050876, 0.522521, 1.0},
+                     {0.353069, 0.372000, 0.017878, 1.0},
+                     {0.052772, 0.010679, 0.823194, 1.0},
+                     {0.012693, 0.414530, 0.052934, 1.0},
+                     {0.870621, 0.579515, 0.004228, 1.0},
+                     {0.453672, 0.029212, 0.781390, 1.0},
+                     {0.850554, 0.181933, 0.081839, 1.0},
+                     {0.995195, 0.941644, 0.244979, 1.0},
+                     {0.009836, 0.595745, 0.308242, 1.0},
+                     {0.036595, 0.019338, 0.315257, 1.0},
+                     {0.209470, 0.207646, 0.478434, 1.0}};
+
+  float hsla[][4] = {{0.0,       0.0  ,   1.0  , 1.0},
+                     {0.0,       0.0  ,   0.500, 1.0},
+                     {0.0,       0.0  ,   0.0  , 1.0},
+                     {0.0,       1.0  ,   0.500, 1.0},
+                     {0.166667,  1.0  ,   0.375, 1.0},
+                     {0.333333,  1.0  ,   0.250, 1.0},
+                     {0.5,       1.0  ,   0.750, 1.0},
+                     {0.666666,  1.0  ,   0.750, 1.0},
+                     {0.833333,  0.500,   0.500, 1.0},
+                     {0.171666,  0.638,   0.393, 1.0},
+                     {0.6975,    0.832,   0.511, 1.0},
+                     {0.374722,  0.707,   0.396, 1.0},
+                     {0.1375,    0.893,   0.497, 1.0},
+                     {0.788028,  0.775,   0.542, 1.0},
+                     {0.039837,  0.817,   0.624, 1.0},
+                     {0.158083,  0.991,   0.765, 1.0},
+                     {0.451149,  0.779,   0.447, 1.0},
+                     {0.689732,  0.601,   0.373, 1.0},
+                     {0.668129,  0.290,   0.607, 1.0}};
+
+  babl_init ();
+
+  CHECK_CONV ("rgba to hsla ", float,
+              babl_format ("RGBA float"),
+              babl_format ("HSLA float"),
+              rgba, hsla);
+
+  CHECK_CONV ("hsla to rgba ", float,
+              babl_format ("HSLA float"),
+              babl_format ("RGBA float"),
+              hsla, rgba);
+
+  babl_exit ();
+
+  return !OK;
+}
diff --git a/tests/hsva.c b/tests/hsva.c
new file mode 100644 (file)
index 0000000..a29f506
--- /dev/null
@@ -0,0 +1,116 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2012, Maxime Nicco <maxime.nicco@gmail.fr>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+ /*
+ * Adding test fo hsva colorspace
+ *
+ * The test is at 0.001 precision
+ */
+
+#include "config.h"
+#include <stdlib.h>
+#include <math.h>
+#include <stdio.h>
+#include <assert.h>
+#include "babl.h"
+
+#define CHECK_CONV(test_name, componenttype, src_fmt, dst_fmt, src_pix, expected_pix) \
+  {       \
+  const Babl *fish;       \
+  int i;       \
+  fish = babl_fish (src_fmt, dst_fmt);       \
+  if (!fish)       \
+    {       \
+      printf ("  %s failed to make fish\n", test_name);       \
+      OK = 0;       \
+    }       \
+  for (i = 0; i < sizeof(src_pix)/sizeof(src_pix[0]); i ++)       \
+    {       \
+      int c;\
+      componenttype result[10];       \
+      babl_process (fish, src_pix[i], result, 1);       \
+      for (c = 0; c < sizeof(expected_pix[i])/sizeof(expected_pix[i][0]); c++) \
+      if (fabs(result[c] - expected_pix[i][c]) > 0.001)       \
+        {       \
+          printf (" %s failed #%i[%i]  got %lf expected %lf\n", test_name, i, c, result[c], expected_pix[i][c]);       \
+          OK = 0;          \
+        }       \
+    }       \
+  }
+
+
+int
+main (int    argc,
+      char **argv)
+{
+  int OK = 1;
+
+  float rgba[][4] = {{ 1.0,    1.0,    1.0,    1.0 },
+                     { 0.2140, 0.2140, 0.2140, 1.0 },
+                     { 0,      0,      0,      1.0 },
+                     { 1,      0,      0,      1.0 },
+                     { 0.5209, 0.5225, 0,      1.0 },
+                     { 0,      0.2140, 0,      1.0 },
+                     { 0.2140, 1,      1,      1.0 },
+                     { 0.2140, 0.2140, 1,      1.0 },
+                     { 0.5215, 0.0508, 0.5225, 1.0 },
+                     { 0.3509, 0.3710, 0.0178, 1.0 },
+                     { 0.0533, 0.0106, 0.8235, 1.0 },
+                     { 0.0126, 0.4132, 0.0529, 1.0 },
+                     { 0.8709, 0.5754, 0.0042, 1.0 },
+                     { 0.4537, 0.0291, 0.7814, 1.0 },
+                     { 0.8501, 0.1813, 0.0814, 1.0 },
+                     { 0.9954, 0.9418, 0.2448, 1.0 },
+                     { 0.0099, 0.5953, 0.3081, 1.0 },
+                     { 0.0366, 0.0193, 0.3150, 1.0 }};
+
+  float hsva[][4] = {{ 0.0,   0.0,   1.0,   1.0 },
+                     { 0.0,   0.0,   0.5,   1.0 },
+                     { 0.0,   0.0,   0.0,   1.0 },
+                     { 0.0,   1.0,   1.0,   1.0 },
+                     { 0.167, 1.0,   0.75,  1.0 },
+                     { 0.333, 1.0,   0.5,   1.0 },
+                     { 0.5,   0.5,   1.0,   1.0 },
+                     { 0.667, 0.5,   1.0,   1.0 },
+                     { 0.833, 0.666, 0.75,  1.0 },
+                     { 0.172, 0.779, 0.643, 1.0 },
+                     { 0.698, 0.887, 0.918, 1.0 },
+                     { 0.375, 0.828, 0.675, 1.0 },
+                     { 0.137, 0.944, 0.941, 1.0 },
+                     { 0.788, 0.792, 0.897, 1.0 },
+                     { 0.040, 0.661, 0.931, 1.0 },
+                     { 0.158, 0.467, 0.998, 1.0 },
+                     { 0.451, 0.875, 0.795, 1.0 },
+                     { 0.690, 0.75,  0.597, 1.0 }};
+
+  babl_init ();
+
+  CHECK_CONV ("rgba to hsva ", float,
+              babl_format ("RGBA float"),
+              babl_format ("HSVA float"),
+              rgba, hsva);
+
+  CHECK_CONV ("hsva to rgba ", float,
+              babl_format ("HSVA float"),
+              babl_format ("RGBA float"),
+              hsva, rgba);
+
+  babl_exit ();
+
+  return !OK;
+}
diff --git a/tests/n_components_cast.c b/tests/n_components_cast.c
new file mode 100644 (file)
index 0000000..4bb7d29
--- /dev/null
@@ -0,0 +1,97 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include "babl.h"
+#include "common.inc"
+
+int
+main (int    argc,
+      char **argv)
+{
+  int OK = 1;
+  babl_init ();
+  {
+    unsigned char in[][4]   = {{0,1,2,3  },{4,5,6,7    },{8,9,10,11  }};
+    unsigned char out1[][1]  = {{0},        {4},  {8}  };
+    unsigned char out2[][2]  = {{0,1},      {4,5},         {8,9}  };
+    unsigned char out4[][4]  = {{0,1,2,3},  {4,5,6,7},    {8,9,10,11}  };
+    unsigned char out5[][5]  = {{0,1,2,3,0},  {4,5,6,7,0},{8,9,10,11,0}  };
+
+    CHECK_CONV("RGBAu8 to n1'", unsigned char,
+        babl_format("R'G'B'A u8"),
+        babl_format_n (babl_type ("u8"), 1),
+        in, out1);
+
+    CHECK_CONV("RGBAu8 to n2'", unsigned char,
+        babl_format("R'G'B'A u8"),
+        babl_format_n (babl_type ("u8"), 2),
+        in, out2);
+
+    CHECK_CONV("RGBAu8 to n4'", unsigned char,
+        babl_format("R'G'B'A u8"),
+        babl_format_n (babl_type ("u8"), 4),
+        in, out4);
+
+    CHECK_CONV("RGBAu8 to n5'", unsigned char,
+        babl_format("R'G'B'A u8"),
+        babl_format_n (babl_type ("u8"), 5),
+        in, out5);
+  }
+  {
+    unsigned char in[][3]   = {{0,1,2  },{4,5,6    },{8,9,10  }};
+    unsigned char out1[][1]  = {{0},        {4},  {8}  };
+    unsigned char out2[][2]  = {{0,1},      {4,5},         {8,9}  };
+    unsigned char out4[][4]  = {{0,1,2,0},  {4,5,6,0},    {8,9,10,0}  };
+    unsigned char out5[][5]  = {{0,1,2,0,0},  {4,5,6,0,0},{8,9,10,0,0}  };
+    unsigned char out6[][6]  = {{0,1,2,0,0,0},  {4,5,6,0,0,0},{8,9,10,0,0,0}  };
+
+    CHECK_CONV("RGBu8 to n1'", unsigned char,
+        babl_format("R'G'B' u8"),
+        babl_format_n (babl_type ("u8"), 1),
+        in, out1);
+
+
+    CHECK_CONV("RGBu8 to n2'", unsigned char,
+        babl_format("R'G'B' u8"),
+        babl_format_n (babl_type ("u8"), 2),
+        in, out2);
+
+
+    CHECK_CONV("RGBu8 to n4'", unsigned char,
+        babl_format("R'G'B' u8"),
+        babl_format_n (babl_type ("u8"), 4),
+        in, out4);
+
+    CHECK_CONV("RGBu8 to n5'", unsigned char,
+        babl_format("R'G'B' u8"),
+        babl_format_n (babl_type ("u8"), 5),
+        in, out5);
+
+    CHECK_CONV("RGBu8 to n6'", unsigned char,
+        babl_format("R'G'B' u8"),
+        babl_format_n (babl_type ("u8"), 6),
+        in, out6);
+  }
+
+  babl_exit ();
+  return !OK;
+}
index 6ad517f682b656a56f4da645be2dd99beca60513..85192622b866852a84e1a5fddae98acd5477bef4 100644 (file)
 #include <stdio.h>
 #include <assert.h>
 #include "babl.h"
-
-
-#define CHECK_CONV(test_name, componenttype, src_fmt, dst_fmt, src_pix, expected_pix) \
-  {       \
-  const Babl *fish;       \
-  int i;       \
-  fish = babl_fish (src_fmt, dst_fmt);       \
-  if (!fish)       \
-    {       \
-      printf ("  %s failed to make fish\n", test_name);       \
-      OK = 0;       \
-    }       \
-  for (i = 0; i < sizeof(src_pix)/sizeof(src_pix[0]); i ++)       \
-    {       \
-      int c;\
-      componenttype result[10];       \
-      babl_process (fish, src_pix[i], result, 1);       \
-      for (c = 0; c < sizeof(expected_pix[i])/sizeof(expected_pix[i][0]); c++) \
-      if (result[c] != expected_pix[i][c])       \
-        {       \
-          printf (" %s failed #%i[%i]  got %i expected %i\n", test_name, i, c, result[c], expected_pix[i][c]);       \
-          OK = 0;          \
-        }       \
-    }       \
-  }
-
-#include <assert.h>
+#include "common.inc"
 
 int
 main (int    argc,
@@ -55,6 +29,7 @@ main (int    argc,
 {
   int OK = 1;
   babl_init ();
+  OK = ! babl_format_is_palette (babl_format_n (babl_type ("double"), 3));
   if(1){
     unsigned char in[][1]   = {{        0},{          1},{          2},{15}};
     unsigned char out[][4]  = {{0,0,0,255},{127,0,0,255},{0,127,0,255},{255,255,255,255}};
index d3af0dde1a32e3a65d280fc3f598f8e73b5ec260..85856456910d68d1dc58f72180ff303e6f557e25 100644 (file)
@@ -32,12 +32,12 @@ unsigned char source_buf [PIXELS * 3] =
   0.0, 0.0, 255 };
 
 unsigned char reference_buf [PIXELS * 3] =
-{ 0,     128, 128,
+{ 0,   128, 128,
   136, 128, 128,
   255, 128, 128,
-  136, 208, 195,
-  224, 42,  211,
-  82,  207, 20 };
+  138, 209, 198,
+  224, 49,  209,
+  75,  196, 16 };
 
 unsigned char destination_buf [PIXELS * 3];
 
diff --git a/tools/Makefile.am b/tools/Makefile.am
new file mode 100644 (file)
index 0000000..f67a66e
--- /dev/null
@@ -0,0 +1,9 @@
+AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/babl
+
+LDADD = $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \
+       $(MATH_LIB)
+
+if HAVE_SRANDOM
+noinst_PROGRAMS =              \
+       babl-gen-test-pixels
+endif
\ No newline at end of file
diff --git a/tools/Makefile.in b/tools/Makefile.in
new file mode 100644 (file)
index 0000000..bd9aed8
--- /dev/null
@@ -0,0 +1,551 @@
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+@HAVE_SRANDOM_TRUE@noinst_PROGRAMS = babl-gen-test-pixels$(EXEEXT)
+subdir = tools
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+babl_gen_test_pixels_SOURCES = babl-gen-test-pixels.c
+babl_gen_test_pixels_OBJECTS = babl-gen-test-pixels.$(OBJEXT)
+babl_gen_test_pixels_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+babl_gen_test_pixels_DEPENDENCIES =  \
+       $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \
+       $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC    " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD  " $@;
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = babl-gen-test-pixels.c
+DIST_SOURCES = babl-gen-test-pixels.c
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALTIVEC_EXTRA_CFLAGS = @ALTIVEC_EXTRA_CFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BABL_API_VERSION = @BABL_API_VERSION@
+BABL_BINARY_AGE = @BABL_BINARY_AGE@
+BABL_CURRENT_MINUS_AGE = @BABL_CURRENT_MINUS_AGE@
+BABL_INTERFACE_AGE = @BABL_INTERFACE_AGE@
+BABL_LIBRARY_VERSION = @BABL_LIBRARY_VERSION@
+BABL_MAJOR_VERSION = @BABL_MAJOR_VERSION@
+BABL_MICRO_VERSION = @BABL_MICRO_VERSION@
+BABL_MINOR_VERSION = @BABL_MINOR_VERSION@
+BABL_REAL_VERSION = @BABL_REAL_VERSION@
+BABL_RELEASE = @BABL_RELEASE@
+BABL_UNSTABLE = @BABL_UNSTABLE@
+BABL_VERSION = @BABL_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIR_SEP = @DIR_SEP@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MATH_LIB = @MATH_LIB@
+MKDIR_P = @MKDIR_P@
+MMX_EXTRA_CFLAGS = @MMX_EXTRA_CFLAGS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEP = @PATH_SEP@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RSVG = @RSVG@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SSE2_EXTRA_CFLAGS = @SSE2_EXTRA_CFLAGS@
+SSE_EXTRA_CFLAGS = @SSE_EXTRA_CFLAGS@
+STRIP = @STRIP@
+VERSION = @VERSION@
+W3M = @W3M@
+WEBSITE_HOST = @WEBSITE_HOST@
+WEBSITE_LOCATION = @WEBSITE_LOCATION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/babl
+LDADD = $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \
+       $(MATH_LIB)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign tools/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstPROGRAMS:
+       @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+       echo " rm -f" $$list; \
+       rm -f $$list || exit $$?; \
+       test -n "$(EXEEXT)" || exit 0; \
+       list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+       echo " rm -f" $$list; \
+       rm -f $$list
+babl-gen-test-pixels$(EXEEXT): $(babl_gen_test_pixels_OBJECTS) $(babl_gen_test_pixels_DEPENDENCIES) $(EXTRA_babl_gen_test_pixels_DEPENDENCIES) 
+       @rm -f babl-gen-test-pixels$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(babl_gen_test_pixels_OBJECTS) $(babl_gen_test_pixels_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/babl-gen-test-pixels.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+       mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-libtool clean-noinstPROGRAMS ctags distclean \
+       distclean-compile distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+       pdf pdf-am ps ps-am tags uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tools/babl-gen-test-pixels.c b/tools/babl-gen-test-pixels.c
new file mode 100644 (file)
index 0000000..cf14fe4
--- /dev/null
@@ -0,0 +1,164 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005 Øyvind Kolås
+ *               2013 Daniel Sabo
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#define BABL_PATH_NUM_TEST_PIXELS       3072
+#define BABL_CONVERSION_NUM_TEST_PIXELS 128
+#define BABL_FROMAT_NUM_TEST_PIXELS     256
+#define BABL_MODEL_NUM_TEST_PIXELS      512
+#define BABL_TYPE_NUM_TEST_PIXELS       512
+
+static double rand_double (void)
+{
+  return (double) random () / RAND_MAX;
+}
+
+static double rand_range_double (double min, double max)
+{
+  return rand_double () * (max - min) + min;
+}
+
+static void gen_path_pixels (void)
+{
+  int i;
+  srandom (20050728);
+
+  printf ("static const int babl_num_path_test_pixels = %d;\n\n", BABL_PATH_NUM_TEST_PIXELS);
+
+  printf ("static const double babl_path_test_pixels[%d] = {\n", BABL_PATH_NUM_TEST_PIXELS * 4);
+
+  /*  add 128 pixels in the valid range between 0.0 and 1.0  */
+  for (i = 0; i < 256; i++)
+    {
+      printf ("%a, %a, %a, %a,\n",
+        rand_double (),
+        rand_double (),
+        rand_double (),
+        rand_double ());
+    }
+
+  /*  add 16 pixels between -1.0 and 0.0  */
+  for (i = 0; i < 16; i++)
+    {
+      printf ("%a, %a, %a, %a,\n",
+        rand_range_double (-1.0, 0.0),
+        rand_range_double (-1.0, 0.0),
+        rand_range_double (-1.0, 0.0),
+        rand_range_double (-1.0, 0.0));
+    }
+
+  /*  add 16 pixels between 1.0 and 2.0  */
+  for (i = 0; i < 16; i++)
+    {
+      printf ("%a, %a, %a, %a,\n",
+        rand_range_double (1.0, 2.0),
+        rand_range_double (1.0, 2.0),
+        rand_range_double (1.0, 2.0),
+        rand_range_double (1.0, 2.0));
+    }
+
+  /* the remaining pixels are 0 */
+  printf ("%a, /* The remaining values default to zero. */ ", 0.0);
+
+  printf ("};\n\n");
+
+  printf ("static const int babl_num_conversion_test_pixels = %d;\n\n", BABL_CONVERSION_NUM_TEST_PIXELS);
+
+  printf ("static const double *babl_conversion_test_pixels = babl_path_test_pixels;\n\n");
+
+  printf ("static const int babl_num_format_test_pixels = %d;\n\n", BABL_FROMAT_NUM_TEST_PIXELS);
+
+  printf ("static const double *babl_format_test_pixels = babl_path_test_pixels;\n\n");
+}
+
+static void gen_model_pixels (void)
+{
+  int i;
+  srandom (20050728);
+
+  printf ("static const int babl_num_model_test_pixels = %d;\n\n", BABL_MODEL_NUM_TEST_PIXELS);
+
+  printf ("static const double babl_model_test_pixels[%d] = {\n", BABL_MODEL_NUM_TEST_PIXELS * 4);
+
+  /*  add 128 pixels in the valid range between 0.0 and 1.0  */
+  for (i = 0; i < BABL_MODEL_NUM_TEST_PIXELS; i++)
+    {
+      printf ("%a, %a, %a, %a,\n",
+        rand_range_double (-0.2, 1.2),
+        rand_range_double (-0.2, 1.2),
+        rand_range_double (-0.2, 1.2),
+        rand_range_double (-0.2, 1.2));
+    }
+
+  printf ("};\n\n");
+}
+
+static void gen_type_pixels (void)
+{
+  int i;
+  srandom (20050728);
+
+  printf ("static const int babl_num_type_test_pixels = %d;\n\n", BABL_TYPE_NUM_TEST_PIXELS);
+
+  printf ("static const double babl_type_test_pixels[%d] = {\n", BABL_TYPE_NUM_TEST_PIXELS * 4);
+
+  /*  add 128 pixels in the valid range between 0.0 and 1.0  */
+  for (i = 0; i < BABL_MODEL_NUM_TEST_PIXELS; i++)
+    {
+      printf ("%a, %a, %a, %a,\n",
+        rand_range_double (0.0, 128.0),
+        rand_range_double (0.0, 128.0),
+        rand_range_double (0.0, 128.0),
+        rand_range_double (0.0, 128.0));
+    }
+
+  printf ("};\n\n");
+}
+
+int main (int argc, char **argv)
+{
+  printf (
+    "/* babl - dynamically extendable universal pixel conversion library.\n"
+    " * Copyright (C) 2005 Øyvind Kolås\n"
+    " *               2013 Daniel Sabo\n"
+    " *\n"
+    " * This library is free software; you can redistribute it and/or\n"
+    " * modify it under the terms of the GNU Lesser General Public\n"
+    " * License as published by the Free Software Foundation; either\n"
+    " * version 3 of the License, or (at your option) any later version.\n"
+    " *\n"
+    " * This library is distributed in the hope that it will be useful,\n"
+    " * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+    " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n"
+    " * Lesser General Public License for more details.\n"
+    " *\n"
+    " * You should have received a copy of the GNU Lesser General\n"
+    " * Public License along with this library; if not, see\n"
+    " * <http://www.gnu.org/licenses/>.\n"
+    " */\n"
+    "\n");
+
+  printf ("/* THIS IS A GENERATED FILE - DO NOT EDIT */\n\n");
+
+  gen_path_pixels ();
+  gen_model_pixels ();
+  gen_type_pixels ();
+}
\ No newline at end of file